ASP.NET Coreドメイン間リクエストの有効化

10663 ワード

本文の翻訳は以下から整理する。https://docs.microsoft.com/en-us/aspnet/core/security/cors?view=aspnetcore-3.1


一、Cross-Origin Requests(CORS)ドメイン間要求


ドメイン間リクエストとは?
ブラウザのセキュリティプロパティは、現在のWebサーバを提供するドメインとは異なるWebページに要求を送信することを阻止します.この制限を同ドメインポリシー(same-orign policy)と呼ぶ.同ドメインポリシーは、悪意のあるWebサイトが別のWebサイトから機密データを読み出すことを阻止します.しかし、他のWebサイトがドメイン間でアプリケーションを要求することを許可する必要がある場合があります.
では、ドメイン間リクエストを実現するにはどうすればいいのでしょうか.W 3 C規格では、ドメイン間リソース共有という解決策を提供しています.
Cross Origin Resource Sharing(CORS):ドメイン間リソース共有
  • はW 3 C規格であり、1つのサーバが同ドメインポリシー
  • を緩和することを可能にする.
  • はセキュリティ特性ではなく、Cross Origin Resource Sharing(CORS)はウェブサイトがより安全ではなく、セキュリティ特性を緩和した.CORSを許可するAPIは、より安全ではない
  • は、1つのサーバがドメイン間要求を許可するドメインを明示的に指定することを許可し、他のドメイン
  • を拒否する.
  • は、以前にドメイン間要求を解決した技術よりも安全で柔軟である.例えば、JSONP
  • 二、同域とは何か


    まったく同じプロトコル、ドメイン名、ポートを持つ2つのURLが同ドメインとみなされます.
    例えば次の2つのURLが同ドメインです
  • https://example.com/foo.html
  • https://example.com/bar.html

  • 次と上の2つは異なるドメインに属します
  • https://example.net–ドメインが異なる
  • https://www.example.com/foo.html–サブドメインが異なる
  • http://example.com/foo.html–プロトコルが異なる
  • https://example.com:9000/foo.html–ポートが異なる
  • 三、どのようにASP.NET Coreでドメイン間リクエストを有効にする


    ASP.NET Coreでドメイン間リクエストを構成するには、次の方法があります.
  • ネーミングポリシーとミドルウェアCORSミドルウェアを使用してドメイン間要求を処理します.コードは次のとおりです.
    public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }
    
        readonly string MyAllowSpecificOrigins = "_myAllowSpecificOrigins";
    
        public IConfiguration Configuration { get; }
    
        public void ConfigureServices(IServiceCollection services)
        {
            //       
            services.AddCors(options =>
            {
                options.AddPolicy(MyAllowSpecificOrigins,
                builder =>
                {
                    //            
                    //            ,           ,        IP  http://192.168.0.1          IP    ,                 
                    builder.WithOrigins("http://192.168.0.1",
                                        "http://www.example.com");
                });
            });
    
            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
        }
    
        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseHsts();
            }
    
            //       
            app.UseCors(MyAllowSpecificOrigins); 
    
            app.UseHttpsRedirection();
            app.UseMvc();
        }
    }

    WithOriginsは、コンフィギュレーションサービスとコンフィギュレーションでドメイン間リクエスト構成を構成および有効にすると、AllowAnyHeader、AllowAnyOriginなどのチェーン呼び出し方法でドキュメントを表示できるCorsPolicyBuilderオブジェクトを返します.注意:パラメータURLはスラッシュ/末尾ではいけません.URLが/末尾であれば、メソッドでURLを比較するとfalseが返されます.つまり、異なるURLUseCorsがミドルウェアを介してすべてのendpointsにCORSポリシーを適用していると考えられます.注意:UseCorsの呼び出しはUseRoutingとUseEndpointsの間でなければなりません.誤った呼び出し順序は
  • を引き起こします.
  • Endpointルーティングを使用ドメイン間でEndpointルーティングを使用可能にし、CORSはRequireCorsを使用可能にし、コードは以下の通りである.
    app.UseEndpoints(endpoints =>
    {
      endpoints.MapGet("/echo", async context => context.Response.WriteAsync("echo"))
        .RequireCors("policy-name");
    });

    同様に、CORSをすべてのコントローラに適用することができます.
    app.UseEndpoints(endpoints =>
    {
      endpoints.MapControllers().RequireCors("policy-name");
    });

  • プロパティを使用してCORS[EnableCors]プロパティを有効にすると、CORSをグローバルに適用する方法が提供されます.[EnableCors]選択した終点に対して、すべての終点に適用するのではなくCORSを有効にします.[EnableCors]を使用してデフォルトのポリシーを指定し、[EnableCors("{Policy String})]を使用して特定のポリシーを指定します.[EnableCors]は、次のいくつかの場所に適用できます.-Razor Page PageModel-Controller-Controller action method[EnableCors]プロパティを使用して、controller/page-model/actionに異なるポリシーを適用できます.[EnableCors]プロパティがcontroller/page-model/actionに適用され、CORSがミドルウェアでも有効になると、両方が機能します.私たちの提案は、ポリシーを重ねないことです.[EnableCors]プロパティまたはミドルウェアを使用して、同じアプリケーションで同時に使用しないでください.
    [Route("api/[controller]")]
    [ApiController]
    public class WidgetController : ControllerBase
    {
       // [EnableCors("AnotherPolicy")] [HttpGet] public ActionResultstring>> Get() { return new string[] { "green widget", "red widget" }; } [EnableCors] // [HttpGet("{id}")] public ActionResult<string> Get(int id) { switch (id) { case 1: return "green widget"; case 2: return "red widget"; default: return NotFound(); } } }

    デフォルトのポリシーを設定します.
            services.AddCors(options =>
            {
                options.AddDefaultPolicy(
                    builder =>
                    {
                       
                        builder.WithOrigins("http://example.com",
                                            "http://www.contoso.com");
                    });
    
                options.AddPolicy("AnotherPolicy",
                    builder =>
                    {
                        builder.WithOrigins("http://www.contoso.com")
                                            .AllowAnyHeader()
                                            .AllowAnyMethod();
                    });
    
            });

    クローズCORS[DisableCors]プロパティは、CORS
  • をクローズするためにcontroller/page-model/actionに適用できます.