CORS预检请求返回HTTP 401与Windows身份验证

问题描述:

我搜索了很多谷歌和堆栈溢出找到解决我的问题,但没有奏效。CORS预检请求返回HTTP 401与Windows身份验证

这里是我的问题:

  • 我用IIS 7具有特殊的编程环境调用Webdev的,不允许OPTIONS HTTP方法的直接操作。所以,所有提出某种使用代码的服务器端请求处理的解决方案都是不可行的。

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

  • 我有一个使用CORS张贴到该服务器的页面。由于此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重写”IIS模块的解决方案。它完美的作品。

1-停止IIS服务(也许不是必要的)

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

3-进入“应用程序”选项卡安装“web平台安装程序”,然后搜索“URL重写”并下载

4-安装此修补程序KB2749660(也许不是必要的)

5打开IIS配置工具,双击 “URL重写”

6-添加新blankrule

7-给它的任何名称

8在 “匹配URL”,指定此模式:.*

9-在 “条件”,指定此条件输入:{REQUEST_METHOD}该图案:^OPTIONS$

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

11-启动服务器

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

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

+2

生命的救星兄弟+1 –

为了让您的模块优先,它将不得不覆盖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>