我在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中的具体步骤是什么?
答案 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>
标签,并且链接的答案显示了如何为每个自定义允许的标题,方法等。