asp.Netcoreシリーズのドメイン間アクセス許可(Enable Cross-Origin Requests:CORS)
11532 ワード
この記事では、ドメイン間アクセスを許可する方法について説明します.
ブラウザセキュリティでは、異なるドメイン名のWebページ間でリクエストを送信できません.この制限を同源戦略(the same-origin policy)と呼ぶ.
同源ポリシーは、悪意のあるサイトが別のサイトの機密データを読み出すことを防止します.
時には、Webサイトがドメイン間のリクエストをアプリケーションに送信することを許可したい場合があります.
Cross Origin Resource Sharing ( CORS ) :
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異なるポート番号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();
}
}
このコードは次のように操作されています.
CorsPolicyBuilderメソッドは、チェーン呼び出しメソッドを使用できます.
builder.WithOrigins("http://example.com",
"http://www.contoso.com")
.AllowAnyHeader()
.AllowAnyMethod();
ドメイン間テスト
3.[EnableCors]プロパティ設定を使用してドメイン間で許可
[EnableCors]プロパティは、ドメイン間で設定する別の方法を提供します.すなわち、全ての端末ではなく、選択する端末のみを設定ことができる.
ここでは、上記の方法とは異なり、アプリケーションのすべての端末がドメイン間で許可されるように設定されている.
ここでは[EnableCors]属性を設定した端末にすぎない.
[EnableCors]を使用してデフォルトのポリシーを指定し、[EnableCors("{Policy String})]を使用して特定のポリシーを指定します.
[EnableCors]プロパティは次のように適用されます.
[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