天天看點

ASP.NET Web API自身對CORS的支援: CORS授權檢驗的實施一、CorsResult二、CorsRequestContext三、CorsEngine

Web API最終需要利用它對具體的跨域資源請求實施授權檢驗并生成相應的CORS響應報頭。在ASP.NET Web

API的應用程式設計接口中,資源授權檢驗的結果通過類型CorsResult來表示。

CorsResult定義在命名空間“System.Web.Cors”下,表示資源提供者針對具體跨域資源請求進行授權檢驗得到的結果,最終寫入響應的CORS報頭均通過此對象來生成。如下面的代碼片斷所示,CorsResult依然具有與6個CORS響應報頭對應的屬性,通過其方法ToResponseHeaders方法的字典表示由此6個屬性生成的CORS相應報頭,字典對象的Key和Value分别表示報頭名稱和值。

CorsResult具有一個布爾類型的屬性IsValid表示請求是否通過資源授權檢驗。如果該屬性傳回False(沒有通過資源授權檢驗),另一個相關的屬性ErrorMessages會提供導緻檢驗失敗的原因。IsValid是一個隻讀屬性,它的值取決于通過ErrorMessages屬性表示的字元串清單是否為空。

針對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引擎中。對于後者,授權檢驗是針對一個System.Web.Cors.CorsRequestContext對象,它代表針對目前請求的上下文。如下面的代碼片斷所示,我們可以通過CorsRequestContext對象得到對應HTTP請求的位址(RequestUri)、主機名稱(Host)和采用的HTTP方法(HttpMethod)。

CorsRequestContext的Origin屬性傳回通過請求的“Origin”報頭表示的源站點。我們可以利用其IsPreflight屬性判斷HTTP請求是否為一個預檢請求,這裡對預檢請求的判斷标準與我們前面示範執行個體采用的完全一緻:采用HTTP-OPTIONS方法摒棄同時具有“Origin”和“Access-Control-Request-Method”報頭。

對于針對預檢請求的CorsRequestContext,我們可以通過其屬性AccessControlRequestMethod和AccessControlRequestHeaders得到請求報頭“Access-Control-Request-Method”和“Access-Control-Request-Headers”的值。通過另一個字典類型的隻讀屬性Properties,我們可以将任意對象作為屬性附加到該CorsRequestContext對象上。

我們說ASP.NET 的核心CORS引擎定義在程式集System.Web.Cors.dll中,它主要體驗為這個名為CorsEngine的對象,其主要的使命在于:根據提供的資源授權政策(通過CorsPolicy類型表示)針對具體的跨域資源請求(通過CorsRequestContext類型表示)實施授權檢驗并得到相應的授權結果(通過CorsResult表示)。所有的CorsEngine類型均實作System.Web.Cors.ICorsEngine接口,如下面的代碼片斷所示,跨域資源請求的授權檢查就實作在其唯一的EvaluatePolicy方法中。

在程式集System.Web.Cors.dll中定義了唯一的實作了ICorsEngine接口,即具有如下定義的類型System.Web.Cors.CorsEngine。如下面的代碼片斷所示,CorsEngine類型定義了3個輔助的虛方法(TryValidateOrigin、TryValidateMethod

和TryValidateHeaders)分别針對請求的源站點以及請求采用的HTTP方法和自定義報頭實施授權檢驗,其中後面兩個方法是專門為預檢請求設計的。

CorsPolicyProviderFactory一樣,ASP.NET Web

API使用的CorsEngine需要注冊到目前HttpConfiguration,注冊的CorsEngine同樣是被添加到HttpConfiguration的屬性字典之中。CorsEngine的注冊可以通過調用HttpConfiguration如下所示的擴充方法SetCorsEngine來完成。另一個擴充方法GetCorsEngine用于擷取注冊的CorsEngine,如果在調用此方法時CorsEngine尚未被注冊,一個CorsEngine對象會被建立出來并自動注冊到HttpConfiguration上。

CORS系列文章

作者:蔣金楠

微信公衆賬号:大内老A

如果你想及時得到個人撰寫文章以及著作的消息推送,或者想看看個人推薦的技術資料,可以掃描左邊二維碼(或者長按識别二維碼)關注個人公衆号(原來公衆帳号蔣金楠的自媒體将會停用)。

本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利。

<a href="http://www.cnblogs.com/artech/p/cors-4-asp-net-web-api-07.html" target="_blank">原文連結</a>

繼續閱讀