当通过jQuery AJAX从iOS Safari/Chrome或Windows7Firefox客户端发出CORS请求时,我看到了401个响应,而不是从IE/Chrome 7客户端生成的。
我有一个ASP.NET MVC 5应用程序,它使用URL调用托管在IIS8.5服务器上的WebApi2.2服务,如
mvc.mydom.com
api.mydom.com
这两个站点的设置都需要windows身份验证。
MVC应用程序使用jQuery Ajax命令向API服务发出请求,如下所示
$.ajax({
dataType: "json",
url: http:'//api.mydom.com/Cars/1',
beforeSend: function (xhr) {
xhr.withCredentials = true;
},
xhrFields: {
withCredentials: true
},
success: function (data) {
//Do stuff
});
},
error: function (xhr, ajaxOptions, thrownError) {
//alert stuff
}
});在我的Web应用程序中,我启用了CORS支持,如下所示:
// configured by application start
config.EnableCors();
config.SetCorsPolicyProviderFactory(new CorsPolicyFactory());
public class CorsPolicyFactory : ICorsPolicyProviderFactory
{
ICorsPolicyProvider provider = new MisCorsPolicyProvider();
public ICorsPolicyProvider GetCorsPolicyProvider(System.Net.Http.HttpRequestMessage request)
{
return this.provider;
}
}
public class MisCorsPolicyProvider : ICorsPolicyProvider
{
private CorsPolicy policy;
public MisCorsPolicyProvider()
{
this.policy = new CorsPolicy
{
AllowAnyMethod = true,
AllowAnyHeader = true,
SupportsCredentials = true
};
this.policy.Origins.Add("http://mvc.mydom.com");
}
public Task<CorsPolicy> GetCorsPolicyAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
return Task.FromResult(this.policy);
}
}想知道这是否是飞行前请求的问题,我遇到了几个引用,这表明IIS8.5需要对Web进行以下更改。
替换
<system.webServer>
<handlers>
<remove name="OPTIONSVerbHandler"/>
</handlers>
<system.webServer>使用
<system.webServer>
<handlers>
<remove name="OPTIONS"/>
</handlers>
<system.webServer>这没什么帮助。
查看iOS和Firefox上开发工具中的请求,我没有看到证书正在传递,但我在Windows /Chrome中看到了。
坏标题/响应的示例如下:
GET http://api.mydom.com/Cars/1 HTTP/1.1
Host: api.mydom.com
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:29.0) Gecko/20100101 Firefox/29.0
Accept: application/json, text/javascript, */*; q=0.01
Accept-Language: en-gb,en;q=0.5
Accept-Encoding: gzip, deflate
Referer: http://mvc.mydom.com/Home/Index
Origin: http://mvc.mydom.com
Connection: keep-alive响应
HTTP/1.1 401 Unauthorized
Content-Type: text/html
Server: Microsoft-IIS/8.5
WWW-Authenticate: Negotiate
X-Powered-By: ASP.NET
Date: Wed, 17 Sep 2014 14:25:49 GMT
Content-Length: 1293
Proxy-Support: Session-Based-Authentication在windows /Chrome网络分析中,我看到一个401错误,然后是对所需资源的200响应。这不会发生在iOS或win Firefox上,让我相信这可能与飞行前请求失败有关,但是请求不是GET的选择。我以为飞行前的要求是个选择
想知道我错过了什么吗?
更新
好的,我认为可能是因为我和Firefox和iOS正确地实现了W3C规范,该规范规定飞行前请求不应该传递用户凭据;因为IIS是为了要求windows身份验证而设置的,请求失败时会出现401.2错误。嗯,铬似乎继续和认证,因此成功。因此,我想是否有一种方法,我可以关闭窗口身份验证的选项请求?
发布于 2015-01-11 12:21:08
刚刚注意到,当他们的Web受到Windows身份验证之类的保护时,许多人已经经历了401错误。CORS飞行前请求不包含凭据,因此IIS将在ASP.NET触及它们之前就使用401.2进行响应。
一个棘手的解决方法是编写一个HTTP模块并将其挂接到IIS管道上,该管道在HttpApplication.BeginRequest事件上注册,在该事件中,该模块返回对飞行前请求的预期200响应。
此解决方案仅适用于IIS 7+集成模式。
您可以阅读包含更多详细信息的我的博客文章。
https://stackoverflow.com/questions/25893793
复制相似问题