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):ドメイン間リソース共有
ドメイン間リクエストとは?
ブラウザのセキュリティプロパティは、現在のWebサーバを提供するドメインとは異なるWebページに要求を送信することを阻止します.この制限を同ドメインポリシー(same-orign policy)と呼ぶ.同ドメインポリシーは、悪意のあるWebサイトが別のWebサイトから機密データを読み出すことを阻止します.しかし、他のWebサイトがドメイン間でアプリケーションを要求することを許可する必要がある場合があります.
では、ドメイン間リクエストを実現するにはどうすればいいのでしょうか.W 3 C規格では、ドメイン間リソース共有という解決策を提供しています.
Cross Origin Resource Sharing(CORS):ドメイン間リソース共有
二、同域とは何か
まったく同じプロトコル、ドメイン名、ポートを持つ2つのURLが同ドメインとみなされます.
例えば次の2つのURLが同ドメインです
次と上の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でドメイン間リクエストを構成するには、次の方法があります.
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の間でなければなりません.誤った呼び出し順序は
app.UseEndpoints(endpoints =>
{
endpoints.MapGet("/echo", async context => context.Response.WriteAsync("echo"))
.RequireCors("policy-name");
});
同様に、CORSをすべてのコントローラに適用することができます.
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers().RequireCors("policy-name");
});
[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