web-dev-qa-db-ja.com

IIS CORS Preflight OPTIONSリクエストをハイジャックします

CORS POSTリクエストを作成し、Content-Typeヘッダーをjsonに設定します。これにより、プリフライトOPTIONSリクエストがトリガーされます(これは適切で期待されています)

このOPTIONSリクエストには200 OKで応答しますが、これは私のWebAPIアプリケーションからのものではありません。

カスタムメッセージハンドラーを配置しており、ヒットしないため、ASP.NETをヒットする前にIISでリクエストに応答しているようです。

この件に関するいくつかの投稿を見つけましたが、彼らは次のように言っています

  1. WebDavがアンインストール/削除/無効化されていることを確認してください-[〜#〜] done [〜#〜]

  2. OPTIONSVerbHandlerが削除され、aspnet_isapi.dllを使用するように変更されていることを確認します-TRIED BOTH

  3. ExtensionlessURLHandlerにOPTIONS動詞が含まれていることを確認してください-[〜#〜] done [〜#〜]

ただし、私のオプションリクエストはまだハイジャックされています。つまり、IISは200 OKで応答しますが、応答にAccess-Control-Allow-Originヘッダーは含まれません。このヘッダーは取得されないため、含まれませんこのヘッダーを設定するWebAPI CORSコードに。

私の問題のような音を見つけることができる2つの最高の投稿は

ここ: JQueryはCORSプリフライトで停止し、IISゴースト応答

そしてここ: http://brockallen.com/2012/10/18/cors-iis-and-webdav/

IISで失敗したリクエストのトレース(FERB)をオンにして、200個すべてのステータスコードをトレースするように設定しました。は、FERBがOPTIONSリクエストを追跡しないこと、またはOPTIONSリクエストを追跡するためにFERB設定を変更する必要がある場合、またはこれが私の問題の手がかりである場合を意味しますか?

これは、ASP.NET WebAPI 2.0で実行されているIIS 7.5(IIS 8および同じ結果のIISExpressでもテストされました)どのブラウザー(Chrome、 FF、およびIEはすべて同じ方法で失敗します)

私はこのテーマで見つけることができるすべてを試してみましたが、それでも私の問題を解決できません。

StackOverflowを手伝ってください、あなたは私の唯一の希望です。

40
Brad Cunningham

ここで試すことができるいくつかのこと、すべてのweb.config関連、最初に以下のように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>

ワイルドカードの値には注意してください。これは、実際にサイトがホストされるドメイン名に設定する必要があります。

29
Tom Hall

それは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>
10

同じ問題が発生し、次の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要求を手動で処理できました。

私はもともと、CORSリクエストを処理するために、この ブログ投稿 で詳述されているライブラリを使用していました。しかし、私が取り組んでいる製品では、runAllManagedModulesForAllRequestsをfalseに設定する必要があります。これが私がカスタム実装をセットアップしなければならなかった理由です、しかし、あなたがその要件を持っていないならば、あなたはそのライブラリを試してみるべきです。 runAllManagedModulesForAllRequestsをtrueに設定できるようになったとき、それはうまく機能しました。

6
jdehlin

私たちの場合、IISルートWebアプリケーションレベルでOPTIONS動詞を無効にします。開くIIS Manager、ルートアプリケーションをクリックし、Requestをクリックします。 OPTIONSがリストに表示された場合、フィルタリングまたは動詞の許可のいずれかをフィルタリングします。

4
Smithyhammer

上記のすべての提案とSOで見つかった他の提案を試しました。私の状況で重要なのは、IISおよびオプションHTTP Verbは許可された動詞のリストにありませんでしたが、追加すると、残りの動詞を整理することができました。

4
powdernine

私の場合、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 }
            );
        }

おそらくすべてにワイルドカードを使いたくないので、本番環境で使用する前にこれを微調整してください

1
Nico Timmerman

私はoWinベースのWebAPIに_Microsoft.AspNet.WebApi.Cors_&_Microsoft.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

    }
_
0
Rousonur Jaman

これは古い投稿であることは知っていますが、まったく同じ問題を経験しました。

私の状況では、OWINとWebAPIの両方にCORSがインストールされています。 OWIN CORSミドルウェアは、WebAPIに到達するずっと前にOPTIONS呼び出しをインターセプトしていました。たぶんこれは将来的に他の誰かを助けるかもしれません。

0
aasukisuki

私の場合、私はこれをしました:

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

<add verb="OPTIONS" allowed="true"/>を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'

そのため、最初に削除する必要がありました。

0
Mahmoodvcs

上記のすべての投稿を試しましたが、何も機能しませんでした。その後、ASP.Net Web API 2サービスをWindows Server 2012(IIS 8.5)に移行し、同じサービスが変更なしで機能しました。そのため、問題はWindows 7マシンでIIS 7.5に固有でした。

0
Ashish Jain

これは私のために働いたものです:

  <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>
0
Shiroy