asp.Netcoreシリーズのドメイン間アクセス許可-1(Enable Cross-Origin Requests:CORS)
7245 ワード
前編の許可ドメイン間
4.CORSポリシー(Policy)のオプション
ここでは、Policyが設定できるオプションについて説明します.
AddPolicyはStartUpにいます.ConfigureServicesメソッドで呼び出されます.いくつかの選択肢については、まずCORSがどのように働いているのかを読んで、役に立つかもしれません.
許可されたソースの設定(Origins)
AllowAnyOrigin:CORSリクエストを任意のソースからアクセスできるようにするのは安全ではありません
注意:AllowAnyOriginとAllowCredentialsを指定するのは安全ではない構成であり、クロスステーション要求の偽造(cross-site request forgery:CSRF)を引き起こす可能性があります.
この2つの構成が適用されると、CORSサービスは無効なCORS応答を返す.
S e t I s O r i g i n AllowedToAllowWildcardSubdomains:ポリシーのIsOriginAllowedプロパティを設定し、構成されたワイルドカード付きドメイン名に一致させる
options.AddPolicy("AllowSubdomain",
builder =>
{
builder.SetIsOriginAllowedToAllowWildcardSubdomains();
});
許可するHTTP methodsを設定する
AllowAnyMethod:
許可されたリクエストヘッダの設定(request header)
CORSリクエストで指定されたリクエストヘッダを許可するには、WithHeadersを使用して指定します.
options.AddPolicy("AllowHeaders",
builder =>
{
builder.WithOrigins("http://example.com")
.WithHeaders(HeaderNames.ContentType, "x-custom-header");
});
すべてのリクエストヘッダを許可
options.AddPolicy("AllowAllHeaders",
builder =>
{
builder.WithOrigins("http://example.com")
.AllowAnyHeader();
});
CORSミドルウェアポリシーは、特定のヘッダにWithHeadersを使用してマッチングされ、要求されたヘッダ(Access-Control-Request-Headersに記録される)は、ドメイン間でWithHeaderのヘッダに正確に一致する必要がある.
例:
適用中のポリシー
app.UseCors(policy => policy.WithHeaders(HeaderNames.CacheControl));
要求されたデータの一部:
Access-Control-Request-Headers: Cache-Control, Content-Language
CORSミドルウェアは、Content-Language(HeaderName.ContentLanguage)がWithHeadersにリストされていないため、この要求を拒否します.
露出した応答ヘッダの設定
デフォルトでは、ブラウザはすべての応答ヘッダをアプリケーションに露出しません.
デフォルトで使用可能な応答ヘッダは次のとおりです.
Cache-Control
Content-Language
Content-Type
Expires
Last-Modified
Pragma
他のヘッダペアアプリケーションを使用可能にするには、WithExposedHeadersを呼び出すことができます.
options.AddPolicy("ExposeResponseHeaders",
builder =>
{
builder.WithOrigins("http://example.com")
.WithExposedHeaders("x-custom-header");
});
クロスソース(cross-origin)リクエストの証明書(Credentials)
デフォルトでは、ブラウザはドメイン間リクエストで証明書を送信できません.
証明書には、キャッシュ(cookies)とHTTP認証プロトコル(HTTP authentication schemes)が含まれています.
ドメイン間で証明書を送信するには、クライアント(ブラウザ)がXMLHttpRequestを設定する必要があります.withCredentialsはtrueです.
XMLHttpRequestの直接使用
var xhr = new XMLHttpRequest();
xhr.open('get', 'https://www.example.com/api/test');
xhr.withCredentials = true;
JQueryの使用
$.ajax({
type: 'get',
url: 'https://www.example.com/api/test',
xhrFields: {
withCredentials: true
}
});
Fetch APIの使用
fetch('https://www.example.com/api/test', {
credentials: 'include'
});
サービス側も証明書を許可する必要があります.AllowCredentialsの使用
options.AddPolicy("AllowCredentials",
builder =>
{
builder.WithOrigins("http://example.com")
.AllowCredentials();
});
Access-Control-Allow-CRedentialsヘッダを含むHTTPレスポンス(HTTP Response)は、サーバがドメイン間リクエストを許可する証明書をブラウザに通知します.
ブラウザが証明書を送信するが、応答に有効なAccess-Control-Allow-CRedentialsヘッダが含まれていない場合、ブラウザは応答をアプリケーションに暴露せず、ドメイン間で失敗します.
ドメイン間証明書の許可はセキュリティ上のリスクです.
ドメイン間でAccess-Control-Allow-CRedentialsヘッダが表示されると、すべてのソース(setting origin to"*")に設定すると無効になります.
参考サイト
https://docs.microsoft.com/en-us/aspnet/core/security/cors?view=aspnetcore-2.2#cors-policy-options
転載先:https://www.cnblogs.com/Vincent-yuan/p/10801513.html