CORS预检请求返回带有Windows身份验证的HTTP 401

时间:2016-07-05 11:02:23

标签: iis cors windows-authentication preflight

我在Google和Stack溢出搜索了很多,为我的问题找到了解决方案,但没有任何效果。

这是我的问题:

  • 我使用IIS 7和一个名为WebDEV的特殊编程环境,它不允许直接操作OPTIONS HTTP方法。因此,所有使用代码建议某种服务器端请求处理的解决方案都是不可行的。

  • 我必须使用Window身份验证并禁用匿名访问

  • 我有一个使用CORS POST到此服务器的页面。由于此POST应具有Content-type: Octet-stream,因此浏览器会发出预检。

  • 当我启用匿名访问时,一切正常(CORS已配置好)

  • 当我禁用匿名访问时,服务器会回复HTTP 401未经授权的预检请求响应,因为它不包含凭据信息。

  • 我尝试为IIS编写一个接受这样的OPTIONS请求的模块,但是它没有用(无法将模块正确地添加到IIS),

    public class CORSModule : IHttpModule
       {
    
              public void Dispose() { 
              }
    
              public void Init(HttpApplication context)
              {
                   context.PreSendRequestHeaders += delegate
                   {
                      if (context.Request.HttpMethod == "OPTIONS")
                       {
                             var response = context.Response;
                             response.StatusCode = (int)HttpStatusCode.OK;
                       }
                   };
              }
        } 
    

问题是:如何在不启用匿名访问或编写某些服务器端代码的情况下,使用HTTP 200响应预检请求?是否有一个简单的配置或现成的模块供IIS使用?至少,将上述模块安装到IIS 7中的具体步骤是什么?

4 个答案:

答案 0 :(得分:7)

以下是使用" URL重写"的解决方案。 IIS模块。它运作得很好。

1-停止IIS服务(可能没有必要)

2-安装"网络平台安装程序"来自https://www.microsoft.com/web/downloads/platform.aspx

3-转到"应用程序"选项卡并搜索" URL重写"并下载它

4-安装此修补程序KB2749660(可能没有必要)

5-打开IIS配置工具,双击" URL重写"

6-添加新的空白规则

7-给它任何名字

8-在"匹配网址",指定此模式:.*

9-在"条件"中,指定此条件条目:{REQUEST_METHOD}并且此模式:^OPTIONS$

10-在"行动",指定:行动类型Personalized response,州代码200,原因Preflight,说明Preflight

11-启动服务器

现在,无论身份验证如何,服务器都应回复对预检请求的200状态代码响应。

备注:我也禁用了所有压缩,我不知道它是否重要。

答案 1 :(得分:4)

从AhmadWabbi的回答中,轻松将XML粘贴到你的web.config中:

<system.webServer>
    <rewrite>
        <rules>
            <rule name="CORS Preflight Anonymous Authentication" stopProcessing="true">
                <match url=".*" />
                <conditions>
                    <add input="{REQUEST_METHOD}" pattern="^OPTIONS$" />
                </conditions>
                <action type="CustomResponse" statusCode="200" statusReason="Preflight" statusDescription="Preflight" />
            </rule>
        </rules>
    </rewrite>
</system.webServer>

答案 2 :(得分:0)

为了使您的模块优先,它必须覆盖IIS中可能会干扰的任何模块。例如,您的web.config可能需要或启用匿名,并创建一个属性来拦截流量并根据需要进行过滤。

答案 3 :(得分:0)

所有涉及编写代码,使用重写模块或对web.config中的值进行硬编码的答案在编写时都是正确的,但我相信2020年对此问题的正确答案是使用{ {3}}。这将处理所有小麻烦,例如必须允许未经身份验证的OPTIONS请求,而无需以其他方式支持未经身份验证的用户。

official IIS CORS module关于使用此模块的一些非常详细的信息,但最简单的配置在顶部:

  <system.webServer>
    <cors enabled="true">
      <add origin="*" allowCredentials="true" />
    </cors>
  </system.webServer>

我当然会将origin="*"更改为您希望使用该API的特定来源。您可以有多个<add>标签,并且链接的答案显示了如何为每个自定义允许的标题,方法等。

相关问题