ASP.NET Web API自身のCORSに対するサポート:CORS授権検査の実施

8585 ワード

「EnableCorsAttributeの特性の背後にある物語」では、CorsPolicyProviderが提供するCorsPolicyは、ターゲットActionが採用するリソースライセンスポリシー、ASP.NET Web APIは、最終的に、特定のドメイン間リソース要求に対して認証検証を実施し、対応するCORS応答ヘッダを生成する必要がある.ASP.NET Web APIのアプリケーションプログラミングインターフェースでは,リソース認証検査の結果をタイプCorsResultで表す.

一、CorsResult


CorsResult定義は、ネーミングスペース「System.Web.Cors」の下で、リソースプロバイダが特定のドメイン間リソース要求に対して認証検証を行った結果、最終的に応答に書き込まれたCORSヘッダがこのオブジェクトによって生成されることを示す.以下のコード断片に示すように、CorsResultは依然として6つのCORS応答ヘッダに対応する属性を有し、その方法ToResponseHeaders法の辞書はこの6つの属性から生成されたCORS対応ヘッダを表し、辞書オブジェクトのKeyとValueはそれぞれヘッダ名と値を表す.
   1: public class CorsResult
   2: {
   3:     public string            AllowedOrigin { get; set; }
   4:     public IList<string>     AllowedExposedHeaders { get; }
   5:     public IList<string>     AllowedHeaders { get; }
   6:     public IList<string>     AllowedMethods { get; }
   7:     public long?             PreflightMaxAge { get; set; }
   8:     public bool              SupportsCredentials { get; set; }
   9:     
  10:     public IList<string>     ErrorMessages { get; }
  11:     public bool              IsValid { get; }
  12:  
  13:     public virtual IDictionary<string, string> ToResponseHeaders();
  14: }

CorsResultには、ブールタイプのプロパティIsValidがあり、リクエストがリソース認証によって検証されたかどうかを示します.この属性がFalse(リソース認証検査を通過していない)を返す場合、別の関連属性ErrorMessagesは検査に失敗する原因を提供します.IsValidは、ErrorMessagesプロパティによって表される文字列のリストが空であるかどうかに応じて、読み取り専用のプロパティです.

二、CorsRequestContext


CORSに対するサポートは、実はASPのみに使用するものではない.NET Web APIでは、提供するリソース授権ポリシーに従ってドメイン間リソース要求を授権検査するためのエンジンがプログラムセットSystemに定義されている.Web.Cors.dllでは、CorsPolicyがプログラムセットSystemに定義以外は、別のプログラムセットで定義.Web.Cors.dll、残りのタイプはプログラムセットSystemに定義する.Web.Http.Cors.dllの相関タイプは、このコアCORSエンジンの拡張と見なすことができる.このセクションで導入したタイプでは、ネーミングスペースは、実際にはプログラムセットを体現しています.
ASPについてNET Web APIによると、CORSリソース認証検査の実施の目標は、要求されたHttpRequestMessageオブジェクトを示すことであり、このオブジェクトは当然ASP.NETのコアCORSエンジン中.後者の場合、認証検査はシステムに対するものである.Web.Cors.現在のリクエストに対するコンテキストを表すCorsRequestContextオブジェクト.以下のコード断片に示すように,CorsRequestContextオブジェクトからHTTPリクエストに対応するアドレス(RequestUri),ホスト名(Host),および採用したHTTPメソッド(HttpMethod)を得ることができる.
   1: public class CorsRequestContext
   2: {
   3:     public Uri         RequestUri { get; set; }
   4:     public string      Host { get; set; }
   5:     public string      HttpMethod { get; set; }    
   6:    
   7:     public string          Origin { get; set; }
   8:     public bool            IsPreflight { get; }
   9:     public string          AccessControlRequestMethod { get; set; }
  10:     public ISet<string>    AccessControlRequestHeaders { get; }
  11:  
  12:     public IDictionary<string, object> Properties { get; }
  13: }

CorsRequestContextのOriginプロパティは、要求された「Origin」ヘッダで表されるソース・サイトを返します.そのPreflightプロパティを使用して、HTTPリクエストがプリフェッチリクエストであるかどうかを判断できます.ここで、プリフェッチリクエストの判断基準は、HTTP-OPTIONSメソッドを使用して、「Origin」および「Access-Control-Request-method」ヘッダを同時に持つことを排除する前の例と完全に一致しています.
事前検査要求に対するCorsRequestContextでは、その属性AccessControlRequestMethodとAccessControlRequestHeadersから要求ヘッダ「Access-Control-Request-Method」と「Access-Control-Request-Headers」の値を得ることができます.別の辞書タイプの読み取り専用プロパティプロパティを使用すると、CorsRequestContextオブジェクトに任意のオブジェクトをプロパティとして追加できます.

三、CorsEngine


ASPと言います.NETのコアCORSエンジンはプログラムセットSystemに定義されている.Web.Cors.dllでは、CorsEngineという名前のオブジェクトを主に体験します.その主な使命は、提供されたリソース認可ポリシー(CorsPolicyタイプで表される)に基づいて、特定のドメイン間リソース要求(CorsRequestContextタイプで表される)に対して認可検査を実施し、対応する認可結果(CorsResultで表される)を得ることです.すべてのCorsEngineタイプはSystemを実現する.Web.Cors.ICorsEngineインタフェースは、次のコード・スライスに示すように、ドメイン間リソース要求の認可チェックを、その唯一のEveluatePolicyメソッドに実装します.
   1: public interface ICorsEngine
   2: {
   3:     CorsResult EvaluatePolicy(CorsRequestContext requestContext, CorsPolicy policy);
   4: }

プログラムセットでWeb.Cors.dllには、ICorsEngineを実現する唯一のインタフェース、すなわち、次のように定義されたタイプのSystemが定義.Web.Cors.CorsEngine.次のコード・セグメントに示すように、CorsEngineタイプは、3つの補助的なダミー・メソッド(TryValidateOrigin、TryValidateMethod、TryValidateHeaders)を定義し、それぞれリクエストのソース・サイトおよびリクエストが採用したHTTPメソッドとカスタム・ヘッダに対して認証検証を実施し、裏面の2つのメソッドは、事前検証リクエストに特化して設計されている.
   1: public class CorsEngine : ICorsEngine
   2: {
   3:     public virtual CorsResult EvaluatePolicy(CorsRequestContext requestContext, CorsPolicy policy);
   4:  
   5:     public virtual bool TryValidateOrigin(CorsRequestContext requestContext, CorsPolicy policy, CorsResult result);
   6:     public virtual bool TryValidateMethod(CorsRequestContext requestContext, CorsPolicy policy, CorsResult result);
   7:     public virtual bool TryValidateHeaders(CorsRequestContext requestContext, CorsPolicy policy, CorsResult result); 
   8: }

CorsPolicyProviderFactory同様、ASP.NET Web APIで使用されているCorsEngineは、現在のHttpConfigurationに登録する必要があります.登録されているCorsEngineは、同じくHttpConfigurationの属性辞書に追加されています.CorsEngineの登録は、HttpConfigurationが以下に示す拡張メソッドSetCorsEngineを呼び出すことによって行うことができる.別の拡張メソッドGetCorsEngineは、登録されたCorsEngineを取得するために使用されます.このメソッドが呼び出されたときにCorsEngineが登録されていない場合、CorsEngineオブジェクトが作成され、自動的にHttpConfigurationに登録されます.
   1: public static class CorsHttpConfigurationExtensions
   2: {
   3:     //    
   4:     public static void SetCorsEngine(this HttpConfiguration httpConfiguration, ICorsEngine corsEngine);
   5:     public static ICorsEngine GetCorsEngine(this HttpConfiguration httpConfiguration);
   6: }

 
CORSシリーズ記事[1]同源戦略とJSONP[2]拡張を利用してASP.NET Web APIはJSONP[3]W 3 CのCORS仕様をサポート[4]拡張によりASP.NET Web APIはCORSをサポート[5]ASP.NET Web API自身によるCORSのサポート:インスタンスから[6]ASP.NET Web API自身によるCORSのサポート:CORSライセンスポリシーの定義と提供[7]ASP.NET Web API自身によるCORSのサポート:CORS認証検査の実施[8]ASP.NET Web API自身によるCORSのサポート:CorsMessageHandler