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



所以我一直在搜索我能找到的关于这个主题的每一篇帖子,但仍然没有弄清楚。希望你能帮忙:

启用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中对我来说似乎一切都很好。

相关内容

  • 没有找到相关文章

最新更新