翻譯如下:
通常授權取決於正在訪問的資源。 例如,文檔可以具有作者屬性。 將只允許文檔作者對其進行更新,因此必須在進行授權評估之前從文檔存儲庫加載資源。 這不能使用Authorize屬性來完成,因為屬性評估發生在數據綁定之前,以及您自己的代碼加載資源之前在一個動作中運行。 而不是聲明性授權,屬性方法,我們必須使用命令式授權,開發人員在其自己的代碼中調用授權函數。
編寫一個資源處理程序
為基於資源的授權編寫處理程序與編寫一個簡單的需求處理程序沒有太大的不同。 您創建一個需求,然后為需求實現一個處理程序,指定前面的需求以及資源類型。 例如,可能接受Document資源的處理程序將如下所示:
public class DocumentAuthorizationHandler : AuthorizationHandler<MyRequirement, Document> { public override Task HandleRequirementAsync(AuthorizationHandlerContext context, MyRequirement requirement, Document resource) { // Validate the requirement against the resource and identity. return Task.CompletedTask; } }
不要忘記你還需要在ConfigureServices方法中注冊你的處理程序;
services.AddSingleton<IAuthorizationHandler, DocumentAuthorizationHandler>();
操作要求
如果您根據讀取,寫入,更新和刪除等操作進行授權決策,則可以在Microsoft.AspNetCore.Authorization.Infrastructure命名空間中使用OperationAuthorizationRequirement類。 這個預構建的類使您能夠編寫具有參數化操作名稱的單個處理程序,而不是為每個操作創建單獨的類。 要使用它提供一些操作名稱:
public static class Operations { public static OperationAuthorizationRequirement Create = new OperationAuthorizationRequirement { Name = "Create" }; public static OperationAuthorizationRequirement Read = new OperationAuthorizationRequirement { Name = "Read" }; public static OperationAuthorizationRequirement Update = new OperationAuthorizationRequirement { Name = "Update" }; public static OperationAuthorizationRequirement Delete = new OperationAuthorizationRequirement { Name = "Delete" }; }
然后,您的處理程序可以如下實現,使用假設的Document類作為資源;
public class DocumentAuthorizationHandler : AuthorizationHandler<OperationAuthorizationRequirement, Document> { public override Task HandleRequirementAsync(AuthorizationHandlerContext context, OperationAuthorizationRequirement requirement, Document resource) { // Validate the operation using the resource, the identity and // the Name property value from the requirement. return Task.CompletedTask; } }
您可以看到處理程序在操作授權要求上工作。 處理程序中的代碼在進行評估時必須考慮提供的需求的Name屬性。
要調用操作資源處理程序,您需要在操作中調用AuthorizeAsync時指定操作。 例如:
if (await authorizationService.AuthorizeAsync(User, document, Operations.Read)) { return View(document); } else { return new ChallengeResult(); }
此示例檢查用戶是否能夠對當前文檔實例執行讀取操作。 如果授權成功,將返回文檔的視圖。 如果授權失敗返回ChallengeResult將通知任何認證中間件授權失敗,中間件可以采取適當的響應,例如返回401或403狀態碼,或將用戶重定向到交互式瀏覽器客戶端的登錄頁面。