2014-08-30 125 views
4

我有一個項目同時包含一個API和一個包含一些Web窗體的區域。
最近API的Token端點開始拋出CORS錯誤,我找不出爲什麼或者如何解決它。爲ASP API令牌請求啓用CORS

我已經更新了Startup.Auth.cs與文件:app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);

也嘗試添加config.EnableCors(new EnableCorsAttribute("*", "*", "GET,POST"));到WebApiConfig.cs文件。

這些都沒有添加所需的'Access-Control-Allow-Origin'標頭。 (如果兩者同時執行,我確實會得到不同的錯誤,所以我知道這不是問題。)

是否存在項目中的另一個位置,我需要設置該位置以允許CORS請求身份驗證令牌?

回答

1

好的,發現了問題。

首先,我的測試工具指向錯誤的位置,所以我所做的任何更改都沒有效果,我的斷點也沒有被擊中。我的錯。

其次,終於得到了我工作的配置是有下面的代碼:

ApplicationOAuthProvider.GrantResourceOwnerCredentials: 
var allowedOrigin = context.OwinContext.Get<string>("as:clientAllowedOrigin"); 
if (allowedOrigin == null) allowedOrigin = "*"; 


WebApiConfig.Register: 
config.EnableCors(new EnableCorsAttribute("*", "*", "GET,POST")); 

我希望這可以幫助任何其他人與CORS和武士刀/ OWIN中間件掙扎。

+0

+1這幫了我很多! – JMK 2014-11-17 00:04:22

2

我不得不在ApplicationOAuthProvider.cs/GrantResourceOwnerCredentials中工作。前三行僅用於參考點,添加了「context.OwinContext」行以使其工作。

public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context) 
     { 
      var userManager = context.OwinContext.GetUserManager<ApplicationUserManager>(); 

      ApplicationUser user = await userManager.FindAsync(context.UserName, context.Password); 

      **context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] { "http://localhost:24589" });** 

如果您想在不同的接入點單獨配置和允許CORS,請使用上述參數。如果您想允許應用程序範圍廣泛,那麼您可以像下面那樣修改ApplicationOAuthProvider.cs/ConfigureAuth。這兩種方法都有效。

public void ConfigureAuth(IAppBuilder app) 
    { 

     app.UseCors(CorsOptions.AllowAll); 
+0

+1第二種方法是快速修復。你只需要添加'Microsoft.Owin.Cors' nuget包。關於SO的另一個非常有用的線索http://stackoverflow.com/questions/20079813/how-to-make-cors-authentication-in-webapi-2 – 2016-04-01 11:24:17

1

在WebApiConfig.cs中啓用CORS後,還應該配置web.config以啓用CORS。這是在我的應用程序的工作:

<system.webServer> 
    <!--Enbale CORS--> 
    <httpProtocol> 
     <customHeaders> 
     <add name="Access-Control-Allow-Origin" value="http://yourwebsite" /> 
     </customHeaders> 
    </httpProtocol> 
    <modules> 
    ... 
    </modules> 
</system.webServer>