【问题标题】:IIS hijacks CORS Preflight OPTIONS requestIIS 劫持 CORS Preflight OPTIONS 请求
【发布时间】:2014-04-25 01:42:12
【问题描述】:

我正在发出 CORS POST 请求并将 Content-Type 标头设置为 json。这会触发一个 Preflight OPTIONS 请求触发(这是好的和预期的)

此 OPTIONS 请求以 200 OK 响应,但这不是来自我的 WebAPI 应用程序。

我有一个自定义消息处理程序,它永远不会被命中,所以请求在命中 ASP.NET 之前得到了 IIS 的响应。

我找到了几个关于这个主题的帖子,他们说如下

  1. 确保 WebDav 已卸载/删除/禁用 - 完成

  2. 确保 OPTIONSVerbHandler 已删除/更改为使用 aspnet_isapi.dll - 同时尝试

  3. 确保 extensionlessURLHandler 包含 OPTIONS 动词 - DONE

但是,我的选项请求仍然被劫持。我的意思是,IIS 以 200 OK 响应,但在响应中不包含 Access-Control-Allow-Origin 标头。它不包含此标头,因为它永远不会访问设置此标头的我的 WebAPI CORS 代码。

我能找到的两个听起来像我的问题的最好的帖子是

这里:JQuery stuck at CORS preflight and IIS ghost response

这里:http://brockallen.com/2012/10/18/cors-iis-and-webdav/

我尝试在 IIS 中打开失败请求跟踪 (FERB) 并将其设置为跟踪所有 200 个状态代码。我从来没有看到选项请求被记录...不确定这是否意味着 FERB 不跟踪 OPTIONS 请求,或者我是否需要更改 FERB 设置中的某些内容以使其跟踪 OPTIONS 请求,或者如果这是一个线索我的问题是什么?

这是在 IIS 7.5 上运行的 ASP.NET WebAPI 2.0(也在 IIS 8 和 IISExpress 上进行了测试,结果相同) 不管是什么浏览器(Chrome、FF 和 IE 都以同样的方式失败)

我已经尝试了所有我能找到的关于这个主题的方法,但仍然无法解决我的问题。

帮助我 StackOverflow,你是我唯一的希望。

【问题讨论】:

标签: asp.net-mvc iis asp.net-web-api cors


【解决方案1】:

你可以在这里尝试一些事情,所有 web.config 相关,首先修改你的 modules 元素以包含属性runAllManagedModulesForAllRequests="true",如下所示:

<modules runAllManagedModulesForAllRequests="true">
    <remove name="WebDavModule" />
</modules>

然后将您的处理程序设置为以下内容:

<handlers>
   <remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" />
   <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
   <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
   <remove name="WebDav" />
   <remove name="OPTIONSVerbHandler" />
   <add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
   <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
   <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>

这应该可以解决问题,但如果没有,作为最后的手段,您可以强制 IIS 使用以下内容输出正确的标头:

  <system.webServer>
    <httpProtocol>
      <customHeaders>
        <add name="Access-Control-Allow-Origin" value="*" />
        <add name="Access-Control-Allow-Methods" value="GET,PUT,POST,DELETE,OPTIONS" />
        <add name="Access-Control-Allow-Headers" value="Content-Type" />
      </customHeaders>
    </httpProtocol>
  </system.webServer>

请注意通配符值,您应该将其设置为您的网站将托管的域名。

【讨论】:

  • 嗨汤姆,我尝试了第一个解决方案,但仍然没有解决问题。第二个解决方案是我目前的“修复”,但这根本不是修复。这是一个 hack,违反了我的 CORS 规则。因为我现在必须允许 origin *,这不是我想要的。我有多个需要信任的消费站点,所以 * 不起作用,单个站点也不起作用。
  • 当然,这是一个 hack,一点也不理想。我自己也遇到了这个问题,并且确实可以正常工作,我很确定这与处理程序映射、设置路径和动词属性有关,请参阅我更新的答案。让我知道它是否有效。
  • 感谢您的更新。我已经尝试了这些设置,但没有运气。这一切都“应该”与我所拥有的一起工作,但有些事情仍然不正确。也许问题更多的是“我怎样才能弄清楚在 IIS 中响应这个请求的内容是什么”?
  • 这有点神秘,不是吗。我刚刚做了一些进一步的阅读,发现了一个可能有用的 sn-p,请将 &lt;remove name="OPTIONSVerbHandler"/&gt; 添加到 &lt;handlers/&gt; 部分。
  • 是的,我也试过了。我看到有人说,删除它,也有人说重新映射它。我都尝试了,但仍然没有运气。感谢到目前为止的建议。我确信那里有解决方案,但我还没有找到。
【解决方案2】:

经过 4 小时的搜索/实验,这对我有用:

    <handlers>
        <remove name="OPTIONSVerbHandler" />
        <add name="OPTIONSVerbHandler" path="*" verb="OPTIONS" modules="IsapiModule" scriptProcessor="C:\Windows\System32\inetsrv\asp.dll" resourceType="Unspecified" requireAccess="None" />
    </handlers>

【讨论】:

  • 你使用的是什么 IIS 版本?
  • Windows Server 2008R2 SP1 上的 IIS 7.5,ASP 经典
  • 使用这个:
【解决方案3】:

我尝试了上述所有建议以及我在 SO 上找到的其他建议,在我的情况下,重要的是我们在 IIS 上启用了请求过滤,并且 OPTIONS HTTP 动词不在允许的动词列表中。一旦我添加了它,我就可以整理它的其余部分。

【讨论】:

  • 你在哪里添加的?
  • 在服务器上的 IIS 中,选择站点,在功能列表中有一个称为请求过滤的选项。然后转到 HTTP Verbs 选项卡,在右侧的 Actions 下选择 Allow Verb 并输入“OPTIONS”并单击确定。
  • 这也是给我的。任何地方的事件或日志中都没有任何内容 - 请求只是 404'd。有趣...它在没有此步骤的情况下在另一个默认情况下没有启用的 IIS 实例上工作。
【解决方案4】:

我遇到了同样的问题,下面的 web.config 设置为我解决了这个问题。

    <modules runAllManagedModulesForAllRequests="false">
      <remove name="FormsAuthenticationModule" />
    </modules>
    <handlers>
      <remove name="OPTIONSVerbHandler" />
      <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
      <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
    </handlers>

然后我能够在 Application_BeginRequest 中手动处理 CORS OPTIONS 请求。

我最初使用blog post 中详述的库来处理 CORS 请求。不过,我正在开发的产品要求将 runAllManagedModulesForAllRequests 设置为 false。这就是我必须设置自定义实现的原因,但是如果您没有该要求,则应该尝试该库。当我能够将 runAllManagedModulesForAllRequests 设置为 true 时,它​​工作得很好。

【讨论】:

  • 是的,我已经在使用 Thinktecture。我有相反的要求,我必须 runAllManageModulesForAllRequests=true。删除 FormsAuthModule 很有趣,我不使用它,所以我将尝试删除它,但如果修复它我会感到惊讶。
  • 奇怪的是,您在使用 Thinktecture 库时遇到了这个问题。我在使用它时不需要对处理程序进行任何更改。
【解决方案5】:

在我们的例子中,IIS 中的请求过滤在根 Web 应用程序级别禁用了 OPTIONS 动词。打开 IIS 管理器,单击根应用程序,单击请求过滤,如果 OPTIONS 出现在列表中,则删除或允许动词。希望我先检查一下,因为浪费了很多时间。

【讨论】:

  • 好先生,您阻止了我将我的笔记本电脑、显示器和 Web 服务器粉碎成数百万个小块。如果我能投票无数次,我会的。谢谢!
【解决方案6】:

就我而言,我错过了 Microsoft.WebApi.Cors 包。 在 WebApiConfig 类中安装了这个包并像这样配置它:

 public static void Register(HttpConfiguration config)
        {
            config.MapHttpAttributeRoutes();
            config.EnableCors(new EnableCorsAttribute("*","*","*"));
            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );
        }

请在生产中使用之前对其进行微调,因为您可能不希望所有内容都使用通配符

【讨论】:

  • 正是我想要的。
【解决方案7】:

这对我有用:

  <system.webServer>
    <handlers>
      <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
      <remove name="OPTIONSVerbHandler" />
      <remove name="TRACEVerbHandler" />
      <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
    </handlers>
  </system.webServer>

【讨论】:

    【解决方案8】:

    检查是否在 IIS 上安装了 URLScan 工具。 如果是这样,请检查以下部分:

    
    ;
    ; The verbs (aka HTTP methods) listed here are those commonly
    ; processed by a typical IIS server.
    ;
    ; Note that these entries are effective if "UseAllowVerbs=1"
    ; is set in the [Options] section above.
    ;
    
    GET
    HEAD
    POST
    OPTIONS
    

    【讨论】:

      【解决方案9】:

      我知道这是一篇旧帖子,但我刚刚遇到了完全相同的问题。

      在我的情况下,我为 OWIN 和 WebAPI 都安装了 CORS。 OWIN CORS 中间件早在 OPTIONS 调用进入 WebAPI 之前就已经拦截了它。也许这对将来的其他人有帮助。

      【讨论】:

      • 是的,你对此做了什么?
      • 我的意思是(显然不是很好)你必须将 CORS 添加到 Owin 中间件和 WebApi 管道中。在我的情况下,做一个或另一个是不够的。此外,您可能需要重新订购 CORS 中间件。例如,如果您在 CORS 中间件之前有身份验证中间件,则调用可能会立即被拒绝,因为 OPTIONS 调用将失败,因为在 CORS 进程之前尝试处理请求。
      【解决方案10】:

      我已经为基于 oWin 的 WebAPI 安装了 Microsoft.AspNet.WebApi.CorsMicrosoft.Owin.Cors,并在配置中添加了 app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);,如下所示:

      public class Startup : IStartup, IAppStartup
      {
          public void Configuration(IAppBuilder app)
          {
              var config = this.GetInjectionConfiguration();
              BootstrapperWebApi bootstrapperWebApi = (BootstrapperWebApi)this.GetBootstrapperWebApi(config);
      
              bootstrapperWebApi.Initialize(true)
              .EnableLogging()
              .DisableWebApiDefaultExceptionHandler();
      
              WebApiConfig.Register(config);
      
              app.UseOwinExceptionHandler();
      
              app.Use<LoggerMiddleware>();
      
              app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
              //others stuff
      
          }
      

      【讨论】:

        【解决方案11】:

        我尝试了所有提到的帖子,但对我没有任何帮助,然后我将我的 ASP.Net Web API 2 服务转移到 Windows Server 2012 (IIS 8.5) 并且相同的服务在没有任何更改的情况下工作。所以问题是特定于 Windows 7 机器上的 IIS 7.5 的。

        【讨论】:

          【解决方案12】:

          就我而言,我是这样做的:

              <verbs allowUnlisted="true" applyToWebDAV="true">
                <remove verb="OPTIONS"/>
                <add verb="OPTIONS" allowed="true"/>
              </verbs>
            </requestFiltering>
          </security>
          

          当我将&lt;add verb="OPTIONS" allowed="true"/&gt; 添加到 web.config 时,应用程序无法启动并出现此错误

          HTTP Error 500.19 - Internal Server Error
          The requested page cannot be accessed because the related configuration data for the page is invalid.
          
          Cannot add duplicate collection entry of type 'add' with unique key attribute 'verb' set to 'OPTIONS'
          

          所以我必须先删除它。

          【讨论】:

            【解决方案13】:

            我也有同样的问题。 OPTIONS 请求返回 200 OK 状态,但它不包含 Access-Control-Allow-Origin 标头。问题是我们的客户网络策略阻止了 OPTIONS 动词请求并以 200 OK 状态响应警告消息。我知道这是旧帖子,但我想与需要的人分享我的案例。

            【讨论】:

              【解决方案14】:

              还有一个案例,也许它会为某人节省时间。当我将配置与 HttpConfiguration.EnableCors 一起使用时,一切正常,但是当我使用 web.config 文件时,却因 CORS 错误而失败。在我删除 .vs 文件夹后它开始工作。

              【讨论】:

              • 你的答案不清楚
              【解决方案15】:

              <figure>
                <img src="https://i.stack.imgur.com/CbRyM.png" alt="">
                <figcaption> change the OptionsVerbHangle</figcaption>
              </figure>
              
              <figure>
                <img src="https://i.stack.imgur.com/wjcMV.png" alt="Minha Figura">
                <figcaption>Adicione * and in the case of php use fastcgimodule</figcaption>
              </figure>
              
              <figure>
                <img src="https://i.stack.imgur.com/wRwpi.png" alt="Minha Figura">
                <figcaption>Mapping to folder
               </figcaption>
              </figure>
              
              <figure>
                <img src="https://i.stack.imgur.com/hhqJi.png" alt="Minha Figura">
                <figcaption>all verbs
               </figcaption>
              </figure>
              
              <figure>
                <img src="https://i.stack.imgur.com/86kKX.png" alt="Minha Figura">
                <figcaption>Select script
               </figcaption>
              </figure>

              只需按照下图解锁 IIS 中的颜色

              enter image description here

              enter image description here

              enter image description here

              enter image description here

              enter image description here

              enter image description here

              【讨论】:

              • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
              猜你喜欢
              • 2018-07-03
              • 2012-12-22
              • 2021-02-22
              • 2012-12-31
              • 2014-01-14
              • 2019-01-05
              • 2016-06-10
              • 2019-10-27
              • 2020-06-30
              相关资源
              最近更新 更多