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

Ahm*_*bbi 9 iis windows-authentication cors preflight

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

这是我的问题:

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

  • 我必须使用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;
                       }
                   };
              }
        } 
    
    Run Code Online (Sandbox Code Playgroud)

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

Ahm*_*bbi 7

这是使用"URL重写"IIS模块的解决方案.它完美地运作.

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

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

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

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

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

6-添加一个新的空白规则

7-给它任何名字

8-在"匹配URL"中,指定此模式: .*

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

10-在"操作"中,指定:操作类型Personalized response,状态代码200,原因Preflight,描述Preflight

11-启动服务器

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

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

  • 救生员兄弟+1 (2认同)

Dou*_*leJ 5

从 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>
Run Code Online (Sandbox Code Playgroud)