サーチ…


備考

ブラウザセキュリティは、WebページがAJAX要求を別のドメインに作成するのを防ぎます。この制限は同じ発信元ポリシーと呼ばれ、悪意のあるサイトが他のサイトから機密データを読み取ることを防止します。しかし、他のサイトがWebアプリにクロスオリジンのリクエストを行うことを許可することがあります。

Cross Origin Resource Sharing(CORS)は、サーバーが同じ発信元ポリシーを緩和できるようにするW3C標準です。 CORSを使用すると、サーバーは他のものを拒否しながら、いくつかのクロスオリジン要求を明示的に許可できます。 CORSは、以前のJSONPなどの技術よりも安全で柔軟性があります。

すべての要求に対してCORSを有効にする

ConfigureメソッドのIApplicationBuilderUseCors()拡張メソッドを使用して、すべての要求にCORSポリシーを適用します。

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc();
    services.AddCors();
}

public void Configure(IApplicationBuilder app)
{
    // Other middleware..

    app.UseCors(builder =>
    {
        builder.AllowAnyOrigin()
               .AllowAnyHeader()
               .AllowAnyMethod();
    });

    // Other middleware..

    app.UseMvc();
}

特定のコントローラでCORSポリシーを有効にする

特定のコントローラに対して特定のCORSポリシーを有効にするには、 ConfigureServicesメソッド内のAddCors拡張でポリシーを構築する必要があります。

services.AddCors(cors => cors.AddPolicy("AllowAll", policy =>
{
    policy.AllowAnyOrigin()
            .AllowAnyMethod()
            .AllowAnyHeader();
}));

これにより、コントローラにポリシーを適用することができます。

[EnableCors("AllowAll")]
public class HomeController : Controller
{
   // ...
}

より洗練されたCORSポリシー

ポリシービルダーを使用すると、洗練されたポリシーを構築できます。

app.UseCors(builder =>
{
    builder.WithOrigins("http://localhost:5000", "http://myproductionapp.com")
           .WithMethods("GET", "POST", "HEAD")
           .WithHeaders("accept", "content-type", "origin")
           .SetPreflightMaxAge(TimeSpan.FromDays(7));
});

このポリシーでは、 GETPOST 、およびHEADメソッドのみを使用した発信元http://localhost:5000およびhttp://myproductionapp.comのみが許可され、 acceptcontent-typeおよびorigin HTTPヘッダーのみが受け入れられます。 SetPreflightMaxAgeメソッドをSetPreflightMaxAgeすると、ブラウザは、プリフライトリクエスト( OPTIONS )の結果を指定された時間キャッシュにキャッシュします。

すべてのコントローラでCORSポリシーを有効にする

すべてのMVCコントローラでCORSポリシーを有効にするには、ConfigureServicesメソッド内のAddCors拡張モジュールにポリシーを作成してから、 CorsAuthorizationFilterFactoryポリシーを設定するCorsAuthorizationFilterFactory

using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Cors.Internal;
...
public void ConfigureServices(IServiceCollection services) {
    // Add AllowAll policy just like in single controller example.
    services.AddCors(options => {
        options.AddPolicy("AllowAll",
           builder => {
                builder.AllowAnyOrigin()
                       .AllowAnyMethod()
                       .AllowAnyHeader();
        });
    });

    // Add framework services.
    services.AddMvc();

    services.Configure<MvcOptions>(options => {
        options.Filters.Add(new CorsAuthorizationFilterFactory("AllowAll"));
    });
}

public void Configure(IApplicationBuilder app) {
    app.useMvc();
    // For content not managed within MVC. You may want to set the Cors middleware
    // to use the same policy.
    app.UseCors("AllowAll");
}

このCORSポリシーは、コントローラまたはアクション単位で上書きできますが、アプリケーション全体のデフォルトを設定できます。



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow