WebAPIでCORSを有効にする方法

ブラウザのセキュリティポリシーのセキュリティ制限により、Webブラウザは別のドメインのサーバーにAJAXリクエストを送信できません。これは同一生成元ポリシーとも呼ばれます。つまり、組み込みのブラウザセキュリティにより、あるドメインのWebページが別のドメインでAJAX呼び出しを実行できなくなります。

ここで、CORS(クロスオリジンリソースシェアリング)が役に立ちます。CORSはW3C標準であり、ブラウザで採用されている同一生成元ポリシーから離れて、あるドメインから別のドメインに属するリソースへのアクセスを制限できます。それぞれのWebAPIパッケージ(使用しているWeb APIのバージョンに応じて)またはOWINミドルウェアを使用して、WebAPIのCORSを有効にできます。

リクエストの発信元は、スキーム、ホスト、およびポート番号で構成されていることに注意してください。したがって、2つの要求が同じスキーム、ホスト、およびポート番号を持っている場合、それらは同じ発信元からのものであると見なされます。これらのいずれかが異なる場合、リクエストはクロスオリジンであると見なされます。つまり、同一のオリジンに属していないと見なされます。

ASP.NET WebAPIでCORSサポートを有効にする

ASP.NET Web APIは、CORSの優れたサポートを提供します。ASP.NET Web API 2でCORSのサポートを提供するには、Microsoft.AspNet.WebApi.CorsNuGetパッケージを使用する必要があります。このパッケージをインストールするには、NuGetパッケージマネージャーコンソールから次のコマンドを実行できます。

インストールパッケージMicrosoft.AspNet.WebApi.Cors

または、ソリューションエクスプローラーウィンドウでプロジェクトを選択し、NuGetパッケージマネージャーを使用してパッケージをインストールすることもできます。

Web API 1.0を使用している場合は、Global.asax.csファイルのApplication_BeginRequestイベントハンドラーに次のステートメントを含めてCORSサポートを有効にできます。

HttpContext.Current.Response.AddHeader( "Access-Control-Allow-Origin"、allowedOrigin); 

HttpContext.Current.Response.AddHeader( "Access-Control-Allow-Methods"、 "GET、POST");

ここでの「allowedOrigin」は、リソースにアクセスするリクエストの発信元を含む文字列変数であることに注意してください。 

CORSのサポートは、3つのレベルで有効にできます。これらには次のものが含まれます。

  • アクションレベル
  • コントローラーレベル
  • グローバルレベル

グローバルレベルでCORSを有効にする

グローバルレベルでCORSを有効にするには、以下に示すコードスニペットに示すように、HttpConfigurationクラスのEnableCorsメソッドを利用する必要があります。

public static void Register(HttpConfiguration config)

        {{

            string origin = "// localhost:50164 / WebClient /";

            EnableCorsAttribute cors = new EnableCorsAttribute(origin、 "*"、 "GET、POST");

            config.EnableCors(cors);

            //ここでWebAPIの構成とサービスを指定します

            //ここでWebAPIルートを指定します          

        }

    }

上記のコードスニペットを参照してください。リクエストの発信元がどのように指定されているかに注意してください。*パラメーターは、すべての要求ヘッダーを意味します。したがって、指定されたドメインからのGETおよびPOSTリクエストは受け入れられ、他のすべてのリクエストは拒否されます。

コントローラレベルでCORSを有効にする

コントローラレベルでCORSサポートを有効にすることもできます。これを行うには、以下に示すように、WebAPIコントローラーに[EnableCors]属性を指定します。

  [EnableCors(origins: "// localhost:50164 /"、headers: "*"、methods: "*")]

    パブリッククラスAuthorsController:ApiController

    {{  

        //ここにWebAPIコントローラーメソッドを記述します

    }

アクションレベルでCORSを有効にする

同様に、[EnableCORS]属性を使用して、アクションレベルでCORSを有効にすることもできます。これがどのように行われるかを示す例を次に示します。

パブリッククラスAuthorsController:ApiController

    {{

        [EnableCors(origins: "// localhost:50164 /"、headers: "*"、methods: "*")]

        public IEnumerable Get()

        {{

            新しい文字列を返す[] {"Joydip Kanjilal"、 "Steve Smith"};

        }

    }

特定のアクションに対してCORSを無効にする

ここで、特定のアクションまたはアクションのグループに対してCORSを無効にする必要がある場合があります。この機能は、グローバルレベルですでにCORSを有効にしていて、セキュリティ上の理由から1つ以上のアクションのために無効にしたい場合に便利です。次のコードスニペットは、[DisableCors]属性を使用してこれを実現する方法を示しています。

[DisableCors()]

public IEnumerable Get()

   {{

      新しい文字列を返す[] {"Joydip Kanjilal"、 "Steve Smith"};

   }

ASP.NET Coreを使用している場合は、NuGetを介してMicrosoft.AspNetCore.Corsパッケージをプロジェクトに追加してから、Startup.csファイルに次のステートメントを記述してCORSサポートを設定する必要があります。

public void ConfigureServices(IServiceCollection services)

{{

    services.AddCors();

}

CORSミドルウェアを使用してCORSを有効にすることができます—この点でUseCors拡張メソッドを利用できます。または、この記事の前半で行ったのとほぼ同じ方法で、EnableCors属性を使用して、コントローラーまたはアクションレベルでCORSを有効にすることができます。同様に、CORSを無効にするには、[DisableCors]属性を使用できます。