2015-10-13 106 views
1

我的Asp.Net5 Web Api無法在Chrome上工作,這是由於CORS問題,似乎我的CORS配置與OAuthBearerAuthentication衝突。 在我Startup.cs:Asp.Net5 EnableCors無效

services.AddCors(); 
    services.ConfigureCors(o => o.AddPolicy("AllowAll", p => p.AllowAnyOrigin() 
    .AllowAnyHeader() 
    .AllowAnyMethod() 
    .AllowCredentials())); 

我的控制器看起來像:

[Authorize(OAuthBearerAuthenticationDefaults.AuthenticationScheme)] 
    [EnableCors("AllowAll")] 
    public class MyController 

然後我得到No 'Access-Control-Allow-Origin' header is present on the requested resource.

但是,如果我刪除授權屬性:

[EnableCors("AllowAll")] 
    public class MyController 

然後我被允許......發生了什麼事情?

+0

你是怎麼解決這個問題的? – Lobato

+0

不幸的是,我沒有 – Noppey

回答

0

首先,清除chrome上的緩存,並嘗試邊緣。 Chrome正在吃掉你的錯誤。

查看請求,你應該有2. PREFLIGHT和請求本身。

如果印前檢查(OPTIONS)失敗,請求甚至無法完成。

通常預檢失敗,因爲服務器錯誤500.例外不包括頭標頭,所以這可能是你的問題在這裏。

好吧,現在,問題是鉻不會顯示錯誤任何地方。 因此,您可以檢查EDGE上的請求,這會給您一個實際的錯誤(您必須使用開發人員控制檯,錯誤不會顯示在瀏覽器上)或使用fiddler。

現在你可以看到你的錯誤,你可以大概知道如何繼續,但要加什麼,我面對自己一點點:

  1. 如果你有services.AddMvc(),這已經增加了CORS的管道,因此使用services.AddCors()再次添加它會引發已發現異常的密鑰。 (我認爲這是一個bug,可能會在github上提出問題)。

  2. 配置CORS時AddMvc使用你這樣做:

    services.ConfigureCors(options => 
            options.AddPolicy("AllowAll", p => p.AllowAnyOrigin() 
                     .AllowAnyMethod() 
                     .AllowCredentials() 
                     .AllowAnyHeader())); 
    
  3. 實際添加CORS的管道,你需要在配置方法做app.UseCors("AllowAll");

  4. 如果您使用的是app.MapWhen請注意MapWhen分叉,因此您可能需要爲MapWhen使用的所有需要​​cors的分支指定UseCors,比如您的api端點。 (如果你沒有什麼,我在這裏談論的想法,就忽視它。)

0

您只需添加以下到web.config文件的system.webServer部分:

<httpProtocol> 
    <customHeaders> 
    <add name="Access-Control-Allow-Origin" value="*" /> 
    <add name="Access-Control-Allow-Methods" value="DELETE, GET, HEAD, OPTIONS, PATCH, POST, PUT" /> 
    <add name="Access-Control-Allow-Headers" value="accept, content-length, content-type" /> 
    </customHeaders> 
</httpProtocol> 

根據需要修改方法和標題。你不能在這些標題中使用*。它還將允許您通過AJAX請求圖片和HTML等內容,而不僅僅是控制器操作提供的資源。