所以我一直在搜索我能找到的关于这个主题的每一篇帖子,但仍然没有弄清楚。希望你能帮忙:
启用CORS的Web API 2:
config.EnableCors(new EnableCorsAttribute("*", "*", "*"));
web.config:
<system.web>
<compilation debug="true" targetFramework="4.5" />
<httpRuntime targetFramework="4.5" />
<authentication mode="Windows" />
</system.web>
jQuery
<script>
$(document).ready(function()
{
$("button").click(function()
{
var endpoint = "http://localhost:82/api/test";
var base64Credentials = window.btoa("domaincredentials:password");
$.ajax({
url: endpoint,
beforeSend: function(xhr) {
xhr.withCredentials = true;
xhr.setRequestHeader("Authorization", "Basic " + base64Credentials);
},
success: function(result) {
alert(result);
}
});
});
});
</script>
IIS已启用基本身份验证
基本身份验证在IE中有效。Firefox和Chrome受飞行前OPTIONS调用的约束
使用Fiddler,我可以看到,如果我将IIS设置为允许匿名身份验证和基本身份验证,那么OPTIONS调用将产生200,然后随后的GET和基本身份认证生效,一切都正常。如果我关闭"匿名者",那么OPTIONS调用会得到401。
问题:
是否需要同时允许匿名和基本身份验证来支持此用例?
我在一个项目中部分解决了这个问题它在IE中总是有效的,但在Chrome中,我仍然会收到401个随机的请求回复,但当我检查响应web api时,它会将JSON数据发送回来,因此它会通过OPTIONS
Web API的IIS站点配置为:
- Windows身份验证,匿名禁用
- 在Windows身份验证提供程序(右侧选项)下,将NTLM移到顶部
在web.config中:
<httpProtocol>
<customHeaders>
<!-- Allows auth in CORS AJAX requests -->
<add name="Access-Control-Allow-Credentials" value="true" />
<!-- May only ever be one value - a domain or "*". "*" is disallowed when Access-Control-Allow-Credentials is true -->
<add name="Access-Control-Allow-Origin" value="http://localhost:63415" />
<add name="Access-Control-Allow-Headers" value="Origin, X-Requested-With, Content-Type, Accept, Access-Control-Request-Headers, Access-Control-Request-Method" />
<add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, HEAD, OPTIONS" />
</customHeaders>
</httpProtocol>
以及在Global.asax.cs 中
protected void Application_BeginRequest()
{
// When Chrome sends the OPTIONS it breaks on windows auth, so this fixes it.
if (Request.Headers.AllKeys.Contains("Origin") && Request.HttpMethod == "OPTIONS")
{
Response.StatusCode = (int)HttpStatusCode.OK;
Response.Flush();
}
}
所有这些都不需要使用CORS NuGet软件包。我试过了,但我仍然有OPTIONS的问题。
编辑:这方面的更新,现在在Chrome中对我来说似乎一切都很好。