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

z3yyvxxp  于 2022-11-12  发布在  Windows
关注(0)|答案(5)|浏览(236)

我在谷歌和Stack Overflow上搜索了很多,想为我的问题找到解决方案,但都不起作用。
我的问题是:

  • 我在IIS 7中使用了一个特殊的编程环境WebDEV,它不允许直接操作OPTIONS HTTP方法,因此,所有建议使用代码进行某种服务器端请求处理的解决方案都是不可行的。
  • 我必须使用Windows身份验证并禁用匿名访问
  • 我有一个页面使用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中的详细步骤是什么?

fv2wmkja

fv2wmkja1#

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

ergxz8rk2#

这里是使用“URL重写”IIS模块的解决方案。它工作得很完美。
1-停止IIS服务(可能不需要)
2-从https://www.microsoft.com/web/downloads/platform.aspx安装“Web平台安装程序”
3-转到“应用程序”选项卡,搜索“URL重写”并下载
4-安装此修复程序KB2749660(可能不需要)
5-打开IIS配置工具,双击“URL重写”
6-添加新的空白规则
7-给它取任何名称
8-在“匹配URL”中,指定此模式:.*
9-在“条件”中,指定以下条件条目:{REQUEST_METHOD}和此模式:^OPTIONS$
10-在“操作”中,指定:操作类型Personalized response,状态代码200,原因Preflight,说明Preflight
11-启动服务器
现在,服务器应使用200状态代码响应预检请求,而不考虑身份验证。
备注:我还禁用了所有压缩,我不知道这是否重要。

pxyaymoc

pxyaymoc3#

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

0pizxfdo

0pizxfdo4#

所有涉及到编写代码、使用重写模块或在web.config中硬编码值的答案在编写时都是正确的,但我相信在2020年解决这个问题的正确答案是使用official IIS CORS module。这将处理所有的小问题,比如必须允许未经身份验证的OPTIONS请求,而不支持未经身份验证的用户。
This related answer提供了一些关于使用此模块的非常详细的信息,但最简单的配置就在顶部:

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

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

8ehkhllq

8ehkhllq5#

虽然这是一个老主题,但下面的文章值得一读。这里有两个解决方案-一个使用授权规则,另一个使用IIS Cors模块。我遇到了这个主题中描述的完全相同的问题,两个解决方案都很好用。
https://techcommunity.microsoft.com/t5/iis-support-blog/putting-it-all-together-cors-tutorial/ba-p/775331
我的API网站的web.config有以下cors配置:

<cors enabled="true" failUnlistedOrigins="true">
    <add origin="http://clienthost:clientport" allowCredentials="true">
      <allowHeaders allowAllRequestedHeaders="true" />
      <allowMethods>
        <add method="GET" />
        <add method="HEAD" />
        <add method="POST" />
        <add method="PUT" /> 
        <add method="DELETE" />   
      </allowMethods>
    </add>      
  </cors>

我在使用Cors模块解决方案时禁用了匿名身份验证。

相关问题