2017-03-17 68 views
1

我有Asp.NET核心Web API應用程序,並試圖實現授權,但遇到CORS問題 - 我的開發服務和用戶界面主機在本地主機的不同端口上。Asp.NET核心:跨服務請求(預檢)返回代碼204而不是200

在登錄頁面我得到令牌並重定向到下一頁。此時數據請求服務啓動。但隨着狀態204服務器響應:沒有內容預檢請求...... 雖然預檢響應返回訪問控制允許來源:* ...

的Startup.cs樣子:

public void ConfigureServices(IServiceCollection services) 
{ 
    // ... 
    services.AddCors(options => 
    { 
     options.AddPolicy("Policy", 
      builder => builder.AllowAnyOrigin() 
      .AllowAnyMethod() 
      .AllowAnyHeader()); 
    }); 
    services.AddAuthorization(); 
    services.AddMvc() // ... 


public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) 
{ 
    app.UseCors("Policy"); 
    app.UseMvc(); 
} 

我錯過了服務器端的東西嗎? (在客戶端角度的攔截器只是添加授權標頭與令牌)

P.S.我使用VS代碼在OSX發展(儘管我想這並不重要)

UPDATE:

爲@tpeczek諫,我已經改變CORS配置:

 options.AddPolicy("Policy", 
      builder => builder.WithOrigins("http://localhost:80", "http://localhost") 
      .AllowAnyMethod() 
      .AllowAnyHeader() 
      .AllowCredentials()); 

但可以」牛逼擺脫錯誤更新2

Preflight looks like this

我得到的錯誤是

XMLHttpRequest cannot load localhost:5000/api/<method-name>;. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'localhost'; is therefore not allowed access. The response had HTTP status code 500. 

但是,一旦我從控制器中刪除[Authorize]屬性,它工作正常。所以問題在於令牌檢查?

更新3: 在意外刪除的問題的功能: - (現在工作

+0

'204 NO CONTENT'您的控制器/中間件是否返回任何數據? –

+0

@JoelHarkes中間件返回「await context.Response.WriteAsync(JsonConvert.SerializeObject(response,new JsonSerializerSettings {Formatting = Formatting.Indented}));」當獲得令牌時。去數據時,中間件不會返回任何東西。沒有到達控制器。我使用的唯一中間件是從https://stormpath.com/blog/token-authentication-asp-net-core – user1820686

+0

得到的如果這仍然不起作用,請在問題中包含預檢請求標頭。 – tpeczek

回答

4

204 NO CONTENT狀態代碼是完全合法CORS預檢響應(見here)從事實

你的問題的結果。您的請求包含Authorization表頭,這使其成爲「憑證請求」。在這種情況下,您不能使用通配符Access-Control-Allow-Origin,並且您必須指定Access-Control-Allow-Credentials(您可以閱讀更多here

services.AddCors(options => 
{ 
    options.AddPolicy("Policy", builder => builder 
     .WithOrigins("<Origin One>", "<Origin Two>", ...) 
     .AllowAnyMethod() 
     .AllowAnyHeader() 
     .AllowCredentials() 
    ); 
}); 
+0

我剛剛添加builder.WithOrigins(「http:// localhost:80」,「http:// localhost」),preflight返回以下標題:Access-Control-Allow-Credentials:true Access-Control-Allow-Headers:授權和訪問控制 - Allow-Origin:http:// localhost,但在主請求 – user1820686

+0

@ user1820686上得到了相同的錯誤源的正確格式是'「://」 [「:」]'。讓它們正確的最簡單的方法是把請求的'Origin'頭部中的東西放在同一個東西上。 – tpeczek

相關問題