標籤:
常授權取決於被訪問的資源。例如一個文檔可以具有作者屬性。僅文檔作者將被允許更新它,所以資源必須從文件庫被載入可以由授權評估之前。這不能與一個授權屬性來完成,因為屬性的評估需要的資料繫結前,在你自己的代碼的地方載入一個動作內的資源運行。相反的聲明授權,屬性的方法,我們必須使用必要的授權,其中一個開發人員稱他自己的代碼中的授權功能。
在代碼中授權
授權是作為一種服務,IAuthorizationService通過該服務集合中註冊,並提供依賴注入的控制器訪問。
公用 類 DocumentController : 控制器{ IAuthorizationService _authorizationService ; 公用 DocumentController (IAuthorizationService authorizationService ) { _authorizationService = authorizationService ; } }
IAuthorizationService 有兩種方法,一是在那裡你,你通過資源和需求評估名單通過資源和政策名稱和其他。
任務< 布爾> AuthorizeAsync (ClaimsPrincipal 使用者, 對象 資源, IEnumerable的< IAuthorizationRequirement > 的要求); 任務< 布爾> AuthorizeAsync (ClaimsPrincipal 使用者, 對象 資源, 串 policyName );
要調用該服務的操作中載入的資源,然後調用AuthorizeAsync您需要的過載。例如
公用 非同步 任務< IActionResult > 編輯(的Guid documentId ){ 文檔 的文檔 = 的DocumentRepository 。尋找(documentId ); 如果 (檔案 == 空) { 返回 新 HttpNotFoundResult (); } 如果 (等待 authorizationService 。AuthorizeAsync (使用者, 檔案, “EditPolicy的” )) { 返回 查看(文檔); } 其他 { 返回 新 ChallengeResult (); } }編寫一個資源處理常式
寫作基於資源授權的處理常式是不是太大的不同來寫一個簡單的要求處理。您建立一個需求,然後實現對需求的處理常式,指定要求的資源類型之前也。例如,這可能會接受一個文檔資源將如下所示的處理常式;
公用 類 DocumentAuthorizationHandler : AuthorizationHandler < MyRequirement , 文檔> { 公眾 覆蓋 任務 HandleRequirementAsync (AuthorizationHandlerContext 背景下, MyRequirement 要求, 文檔 資源) { //驗證對資源和身份的要求。 返回 任務。CompletedTask ; } }
不要忘了,你還需要註冊在你的處理ConfigureServices方法;
服務。AddSingleton < IAuthorizationHandler , DocumentAuthorizationHandler >();
操作要求
如果您正在基於例如讀取操作的決定,寫,更新和刪除,您可以使用OperationAuthorizationRequirement類的Microsoft.AspNetCore.Authorization.Infrastructure命名空間。此預建要求類,您可以編寫具有參數化的操作名稱,一個單一的處理常式,而不是為每個操作建立單獨的類。要使用它提供了一些操作的名稱:
公用 靜態 類 操作{ 公用 靜態 OperationAuthorizationRequirement 建立 = 新 OperationAuthorizationRequirement { 名稱 = “建立” }; 公用 靜態 OperationAuthorizationRequirement 讀 = 新 OperationAuthorizationRequirement { 名稱 = “讀取” }; 公用 靜態 OperationAuthorizationRequirement 更新 = 新 OperationAuthorizationRequirement { 名稱 = “更新” }; 公用 靜態 OperationAuthorizationRequirement 刪除 = 新 OperationAuthorizationRequirement { 名稱 = “刪除” }; }
然後,您的處理常式,可以實現如下,用一個假設的Document類為資源;
公用 類 DocumentAuthorizationHandler : AuthorizationHandler < OperationAuthorizationRequirement , 文檔> { 公眾 覆蓋 任務 HandleRequirementAsync (AuthorizationHandlerContext 背景下, OperationAuthorizationRequirement 要求, 文檔 資源) { //使用資源,身份和驗證操作 從需求// Name屬性值。 返回 任務。CompletedTask ; } }
你可以看到處理器上工作OperationAuthorizationRequirement。處理常式中的代碼使得其評估時必須考慮的要求提供Name屬性考慮在內。
打電話給你打電話時需要指定動作的工作資源處理常式AuthorizeAsync在你的行動。例如
如果 (的await authorizationService 。AuthorizeAsync (使用者, 檔案, 業務,讀)){ 返回 查看(文檔); } 其他{ 返回 新 ChallengeResult (); }
這個例子檢查使用者是否能夠為當前執行讀操作document執行個體。如果授權成功將返迴文檔的視圖。如果授權失敗返回ChallengeResult將通知任何身分識別驗證的中介軟體授權失敗和中介軟體可以採取適當的響應,例如返回一個401或403狀態代碼,或將使用者重新導向到登入頁面進行互動式瀏覽器用戶端。
ASP.NET Core--基於資源授權