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

7245 ワード


前編の許可ドメイン間

4.CORSポリシー(Policy)のオプション


ここでは、Policyが設定できるオプションについて説明します.
  • 許可アクセスソース
  • を設定する.
  • 許可HTTP methods
  • を設定
  • 許可リクエストヘッダ
  • を設定する
  • 露出応答ヘッダ
  • を設定する.
  • 異なるソース要求にまたがる証明書(Credentials)
  • 有効期限
  • を設定する.
    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:
  • HTTP method
  • を許可
  • 影響予検要求(preflight request)およびAccess-Control-Allow-methods header
  • 許可されたリクエストヘッダの設定(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