Web API + CORS + Basic NTLM:401与Firefox + Chrome

时间:2014-10-29 02:06:38

标签: asp.net authentication asp.net-web-api cross-domain

所以我一直在拖着我能找到的关于这个主题的每一篇文章,但仍然没有想出来。希望你能提供帮助:

启用了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("domain\credentials:password");

        $.ajax({
            url: endpoint,
            beforeSend: function(xhr) {
                xhr.withCredentials = true;
                xhr.setRequestHeader("Authorization", "Basic " + base64Credentials);
            },
            success: function(result) {
                alert(result);
            }
        }); 
    });
});
</script>

IIS已启用基本身份验证。

Basic Auth在IE中运行。 Firefox和Chrome受预检OPTIONS调用。

使用Fiddler,我可以看到,如果我将IIS设置为同时允许匿名身份验证和基本身份验证,那么OPTIONS调用将导致200,然后随后基本身份验证的GET开始,并且一切都在世界上。如果我关闭Anonymous,那么我在OPTIONS调用上得到401。

问题:

是否要求允许匿名和基本身份验证支持此用例?

1 个答案:

答案 0 :(得分:1)

我在其中一个项目中部分解决了这个问题。它总是在IE中运行,但在Chrome中我仍会得到随机的401回复请求,但当我检查响应时,web api正在发送JSON数据,以便它通过OPTIONS。

Web API的IIS站点配置是: - Windows Auth,匿名禁用; - 在Windows Auth提供程序(右侧选项)下,将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中的所有内容都非常适合我。