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

CORS preflight request returning HTTP 401 with windows authentication

我在 Google 和 Stack overflow 上进行了大量搜索以找到解决我的问题的方法,但没有任何效果。

这是我的问题:

问题是:如何使 IIS 使用 HTTP 200 响应预检请求而不启用匿名访问或编写一些服务器端代码? IIS 是否有简单的配置或现成的模块来执行此操作?至少,将上述模块安装到IIS 7中的详细步骤是什么?

这里是使用"URL Rewrite" IIS模块的解决方案。它完美运行。

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

2- 从 https://www.microsoft.com/web/downloads/platform.aspx

安装 "web platform installer"

3- 转到 "Applications" 选项卡并搜索 "URL Rewrite" 并下载

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

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

6- 添加新的空白规则

7- 随便起一个名字

8- 在 "Match URL" 中指定此模式:.*

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

10- 在 "Action" 中指定:操作类型 Personalized response、状态代码 200、原因 Preflight、描述 [​​=15=]

11- 启动服务器

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

备注:我也禁用了所有压缩,不知道有没有关系

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

根据 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>

所有涉及编写代码、使用重写模块或 web.config 中的 hard-coding 值的答案在编写时都是正确的,但我相信 2020 年此问题的正确答案是使用 official IIS CORS module。这将处理所有小问题,例如必须允许未经身份验证的 OPTIONS 请求,而不以其他方式支持未经身份验证的用户。

This related answer 有一些关于使用此模块的非常详细的信息,但最简单的配置就在顶部:

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

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