我有一个令牌端点,通过用户名和密码授予类型来验证用户身份。此令牌端点是从AngularJS服务调用的,该服务是我的MVC Web前端的一部分。当我调用该服务时,我收到以下错误
XMLHttpRequest: Network Error 0x80070005, Access is denied.
这似乎是一个CORS问题。到目前为止,我做了以下工作以解决这个问题
我将app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
添加到我的Startup.cs
文件中,用于我的令牌网络服务。
public class Startup
{
public void Configuration
(
IAppBuilder app
)
{
ConfigureOAuth(app);
var config = new HttpConfiguration();
WebApiConfig.Register(config);
config.Filters.Add(new AuthorizeAttribute());
app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
app.UseWebApi(config);
}
private void ConfigureOAuth
(
IAppBuilder app
)
{
app.UseOAuthAuthorizationServer(new OAuthServerOptionsProvider().Provide());
app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions());
}
我还有一个覆盖OAuthAuthorizationServerProvider
的类,在GrantResourceOwnerCredentials
方法中我有以下代码将所有来源添加到响应标题
public override async Task GrantResourceOwnerCredentials
(
OAuthGrantResourceOwnerCredentialsContext context
)
{
System.Web.HttpContext.Current.Response.Headers.Add("Access-Control-Allow-Origin", "*");
// Other code left out to keep this short
}
在fiddler中,我可以看到响应头已成功添加
这里有什么我想念的吗?
更新
这是我的请求标题
答案 0 :(得分:0)
首先,我必须指出@maurycy所做的评论帮助我在this stackoverflow帖子的评论中找到了解决方案。
这篇文章解释了Startup.cs文件中的app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
应该移到方法的顶部,并且应该从System.Web.HttpContext.Current.Response.Headers.Add("Access-Control-Allow-Origin", "*");
类中删除GrantResourceOwnerCredentials
。所以我改变了我的问题中的代码,看起来像这样,
public class Startup
{
public void Configuration(IAppBuilder app)
{
ConfigureOAuth(app);
var config = new HttpConfiguration();
WebApiConfig.Register(config);
config.Filters.Add(new AuthorizeAttribute());
app.UseWebApi(config);
}
private void ConfigureOAuth(IAppBuilder app)
{
app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
app.UseOAuthAuthorizationServer(new OAuthServerOptionsProvider().Provide());
app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions());
}
}
我也更改了覆盖OAuthAuthorizationServerProvider
的类public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
{
// Remove the response header that was added
// Other code left out to keep this short
}