CORS 预检请求返回带有 windows 身份验证的 HTTP 401
CORS preflight request returning HTTP 401 with windows authentication
我在 Google 和 Stack overflow 上进行了大量搜索以找到解决我的问题的方法,但没有任何效果。
这是我的问题:
我将 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;
}
};
}
}
问题是:如何使 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、方法等。
我在 Google 和 Stack overflow 上进行了大量搜索以找到解决我的问题的方法,但没有任何效果。
这是我的问题:
我将 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; } }; } }
问题是:如何使 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、方法等。