asp.Netcoreシリーズのドメイン間アクセス許可(Enable Cross-Origin Requests:CORS)

11532 ワード


この記事では、ドメイン間アクセスを許可する方法について説明します.
 
ブラウザセキュリティでは、異なるドメイン名のWebページ間でリクエストを送信できません.この制限を同源戦略(the same-origin policy)と呼ぶ.
同源ポリシーは、悪意のあるサイトが別のサイトの機密データを読み出すことを防止します.
時には、Webサイトがドメイン間のリクエストをアプリケーションに送信することを許可したい場合があります.
 
Cross Origin Resource Sharing ( CORS ) : 
  • はW 3 Cの標準です.すなわち、同源ポリシー
  • を緩和することができる.
  • は安全な機能ではなく、CORSは安全性を緩和した.ドメイン間で許可されると、APIはより安全ではありません.
  • は、1つのサービスがドメイン間要求を明確に許可し、他の
  • を拒否することを許可する.
  • は以前の技術(例えばJSONP)よりも安全で、より柔軟な
  • である.
     

    1.では同源とは何か


    2つのURLsが同じソースである場合、同じプロトコル、ホスト(ドメイン名)、ポートがあります.
    次の2つは同じソースのURLsです.
  • https://example.com/foo.html
  • https://example.com/bar.html

  • 次の2つのURLに比べて、異なるソースがあります.
  • https://example.net–Different domainの異なるドメイン名
  • https://www.example.com/foo.html–Different subdomainの異なるサブドメイン名
  • http://example.com/foo.html–Different scheme異なるプロトコル
  • https://example.com:9000/foo.html–Different port異なるポート番号
  • IEブラウザが同源問題を考える場合、ポート番号は考慮されません
     

    2.ポリシー付きCORSとミドルウェア


    CORSミドルウェアはドメイン間要求を処理する.次のコードでは、指定されたソースがアプリケーション全体をドメイン間で要求できるようにします.
    public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }
    
        readonly string MyAllowSpecificOrigins = "_myAllowSpecificOrigins";
    
        public IConfiguration Configuration { get; }
    
        public void ConfigureServices(IServiceCollection services)
        {
         //AddCors CORS (service container); services.AddCors(options
    => { options.AddPolicy(MyAllowSpecificOrigins, builder => { builder.WithOrigins("http://example.com", //CorsPolicyBuilder , "http://www.contoso.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); // CORS CORS (endpoints);
    // :1.UseCors UseMvc ;2. URL / ; url
    builder.WithOrigins(url) url

    
    
            app.UseHttpsRedirection();
            app.UseMvc();
        }
    }

    このコードは次のように操作されています.
  • ポリシー名を_として設定myAllowSpecificOrigins、この名前は勝手につけた
  • です.
  • UseCors拡張メソッドを呼び出し、ドメイン間
  • を許可する
  • lambda式を持つAddCorsメソッドを呼び出します.Lambda式はCorsPlicyBuildオブジェクトを取得し、いくつかの設定を行います.
     
    CorsPolicyBuilderメソッドは、チェーン呼び出しメソッドを使用できます.
    builder.WithOrigins("http://example.com",
                                    "http://www.contoso.com")
                                    .AllowAnyHeader()
                                    .AllowAnyMethod();

     
    ドメイン間テスト
     

    3.[EnableCors]プロパティ設定を使用してドメイン間で許可


    [EnableCors]プロパティは、ドメイン間で設定する別の方法を提供します.すなわち、全ての端末ではなく、選択する端末のみを設定ことができる.
    ここでは、上記の方法とは異なり、アプリケーションのすべての端末がドメイン間で許可されるように設定されている.
    ここでは[EnableCors]属性を設定した端末にすぎない.
     
    [EnableCors]を使用してデフォルトのポリシーを指定し、[EnableCors("{Policy String})]を使用して特定のポリシーを指定します.
     
    [EnableCors]プロパティは次のように適用されます.
  • Razor Page PageModel
  • Controller
  • Controller action method

  •  
    [EnableCors]プロパティを使用して、コントロール/page-model/actionに異なるポリシーを適用できます.
    [EnableCors]プロパティがcontroller/page-model/actionに適用され、CORSがミドルウェアで許可された場合(「Enablel(「{Policy String}」)この2つのポリシーが使用される.
    併用ポリシーは推奨されません.同じアプリケーションで2つを使用するのではなく、[EnableCors]プロパティまたはミドルウェアを使用します.
     
    次のコードは、各メソッドにポリシーを使用します.
    [Route("api/[controller]")]
    [ApiController]
    public class WidgetController : ControllerBase
    {
        // GET api/values
        [EnableCors("AnotherPolicy")]
        [HttpGet]
        public ActionResultstring>> Get()
        {
            return new string[] { "green widget", "red widget" };
        }
    
        // GET api/values/5
        [EnableCors]        // Default policy.
        [HttpGet("{id}")]
        public ActionResult<string> Get(int id)
        {
            switch (id)
            {
                case 1:
                    return "green widget";
                case 2:
                    return "red widget";
                default:
                    return NotFound();
            }
        }
    }

     
    次のコードは、デフォルトのポリシーとAnotherPolicyという名前のポリシーを作成します.
    public class StartupMultiPolicy
    {
        public StartupMultiPolicy(IConfiguration configuration)
        {
            Configuration = configuration;
        }
    
        public IConfiguration Configuration { get; }
    
        public void ConfigureServices(IServiceCollection services)
        {
            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();
                    });
    
            });
    
            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
        }
    
        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseHsts();
            }
    
            app.UseHttpsRedirection();
            app.UseMvc();
        }
    }

     
    また、「DisableCors」属性ではCORSが禁止されていますが、ここではしばらく説明しません
     
     
    ...続きます
     
    転載先:https://www.cnblogs.com/Vincent-yuan/p/10798866.html