启用Windows身份验证的IIS中的CORS请求的401响应

dar*_*ins 38 ntlm windows-authentication iis-7.5 cors asp.net-web-api

我正在尝试在我的WebAPI项目中启用CORS支持,如果我启用匿名身份验证,那么一切正常,但是使用Windows Auth +禁用匿名身份验证,发送的OPTIONS请求始终返回401未经授权的响应.请求它的站点位于DOMAIN上,因此应该可以进行呼叫,有没有办法解决问题而不禁用Windows身份验证?

Jan*_*nda 37

您只能为匿名用户允许OPTIONS谓词.

<system.web>
  <authentication mode="Windows" />
    <authorization>
      <allow verbs="OPTIONS" users="*"/>
      <deny users="?" />
  </authorization>
</system.web>
Run Code Online (Sandbox Code Playgroud)

根据W3C规范,浏览器会从CORS预检中删除用户凭据:https://dvcs.w3.org/hg/cors/raw-file/tip/Overview.html#preflight-request

  • 这不起作用! (14认同)
  • 显然是的."匿名身份验证使用户可以访问您的Web或FTP站点的公共区域,而不会提示他们输入用户名或密码." http://bit.ly/1wjLdO9 (6认同)
  • 看起来像一个简洁的解决方案.现在,如何为asp.net核心设置此配置? (3认同)
  • 这是否需要在IIS中启用匿名身份验证模块? (2认同)

Stu*_*Stu 22

几年后,但是通过@dariusriggins和@ lex-li的回答,我设法将以下代码添加到我的Global.asax:

    public void Application_BeginRequest(object sender, EventArgs e)
    {
        string httpOrigin = Request.Params["HTTP_ORIGIN"];
        if (httpOrigin == null) httpOrigin = "*";
        HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", httpOrigin);
        HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
        HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, X-Token");
        HttpContext.Current.Response.AddHeader("Access-Control-Allow-Credentials", "true");

        if (Request.HttpMethod == "OPTIONS")
        {
            HttpContext.Current.Response.StatusCode = 200;
            var httpApplication = sender as HttpApplication;
            httpApplication.CompleteRequest();
        }
    }
Run Code Online (Sandbox Code Playgroud)

httpOrigin实际上是在允许的主机列表中查找的,但这只是复杂的事情.这意味着所有其他请求都已经过验证,但选项只会返回.

谢谢你提出这个问题,如果没有它,我会失败的!

  • 我尝试了许多不同的方法来启用CORS,在IIS上为Angular 2客户端运行WebAPI,包括将其添加到web.config,控制器操作上的数据注释以及在WebApiConfig.Register中调用"EnableCors".这个解决方案是唯一一个实际使用Windows身份验证(NTLM)的**,同时确保Angular 2 http客户端在HTTP头中发送`withCredentials`.谢谢! (3认同)

dar*_*ins 15

来自MS:

如果禁用匿名身份验证,则设计IIS将向任何请求返回401.如果他们已启用Windows身份验证,那么在这种情况下401响应将具有WWW-Authenticate标头以允许客户端启动身份验证握手.然后问题是客户使用的客户端是否可以进行Windows身份验证.

最后,似乎可能存在一个潜在的问题,即是否可以配置URL以允许一个动词(在本例中为OPTIONS)允许匿名访问,但需要对其他动词进行Windows身份验证.IIS不支持通过简单配置.通过启用匿名和Windows身份验证,在拒绝访问匿名用户的内容上设置ACL,然后为相关URL配置处理程序映射,以便它不验证是否存在,可能会出现此行为与URL关联的文件.但要确认这一点需要一些玩法.

  • 刚刚注意到许多人在他们的Web API受到Windows身份验证等保护时遇到了401错误.CORS预检请求不包含凭据,因此即使在ASP.NET接触之前,IIS也会使用401.2进行响应.一个肮脏的解决方法是编写HTTP模块并挂钩到IIS管道,该管道在`HttpApplication.BeginRequest`事件上注册,其中该模块返回预检请求的预期200响应.此解决方法仅适用于IIS 7+集成模式.可悲的是,微软支持可能不会意识到这个提示. (2认同)
  • 刚刚发表了一篇博文,https://blog.lextudio.com/2014/11/how-to-handle-cors-preflight-requests-in-asp-net-mvcweb-api-with-windows-authentication/ 以及更多内容有关 IIS 6 和经典模式用户的信息。 (2认同)

小智 5

解决此问题的最简单方法是使用条件 request_method = ^OPTIONS$ 创建重写规则。然后将操作设置为自定义响应,将其设置为 200 OK。然后所有选项请求将响应 200 而不是 401。这将解决 CORS 问题。

当然,您仍然需要确保拥有正确的跨源请求标头。

这将在启用集成身份验证时停止响应 401 的选项请求(没有任何凭据)。


小智 5

接受的答案是正确的,但是我正在使用“带有 iisnode 和 npm cors 模块的节点”设置对 REST API 进行故障排除一段时间,并且对只为所有用户启用匿名身份验证感到不舒服。由于它是一个节点应用程序,system.web 标签没有太多作用。我最终在 web.config 中添加了以下内容:

<system.webServer>
<security>
  <requestFiltering>
    <hiddenSegments>
      <add segment="node_modules" />
    </hiddenSegments>
  </requestFiltering>
  <authorization>
    <add accessType="Allow" verbs="OPTIONS" users="?" />
    <add accessType="Deny" verbs="GET, PUT, POST, DELETE" users="?" />
  </authorization>
</security>
</system.webServer>
Run Code Online (Sandbox Code Playgroud)


小智 5

扩展@dariusriggins 提供的答案。检查这篇文章:微软| 开发人员:将所有内容放在一起 \xe2\x80\x93 CORS 教程

\n\n

对于 IIS 配置:

\n\n

授权规则

\n\n

授权规则

\n\n

授权阶段(或授权事件),我们需要确保只允许来自 CORS 预检的匿名请求,并要求所有其他传入请求提供身份验证凭据。我们可以通过授权规则来实现这一点。授予所有用户访问该站点的默认授权规则已就位,并由 IIS 默认提供。我们将首先修改此规则,仅允许匿名用户发送使用 OPTIONS http 谓词的请求。以下是 IIS 中此授权规则的目标配置:

\n\n

编辑授权规则

\n\n

编辑授权规则

\n