ASP.NET Core--基於受權的資源

翻譯以下: c#

  一般受權取決於正在訪問的資源。 例如,文檔能夠具備做者屬性。 將只容許文檔做者對其進行更新,所以必須在進行受權評估以前從文檔存儲庫加載資源。 這不能使用Authorize屬性來完成,由於屬性評估發生在數據綁定以前,以及您本身的代碼加載資源以前在一個動做中運行。 而不是聲明性受權,屬性方法,咱們必須使用命令式受權,開發人員在其本身的代碼中調用受權函數。瀏覽器

在代碼中受權

  受權被實現爲服務,AuthorizationService,在服務集合中註冊而且經過依賴注入可用於控制器訪問。async

 
public class DocumentController : Controller
{
    IAuthorizationService _authorizationService;

    public DocumentController(IAuthorizationService authorizationService)
    {
        _authorizationService = authorizationService;
    }
}

  IAuthorizationService接口有兩種方法,一種是傳遞資源和策略名稱,另外一種是傳遞資源的地方和要求求值的需求列表。ide

Task<bool> AuthorizeAsync(ClaimsPrincipal user,
                          object resource,
                          IEnumerable<IAuthorizationRequirement> requirements);
Task<bool> AuthorizeAsync(ClaimsPrincipal user,
                          object resource,
                          string policyName);

  要調用服務在您的操做中加載您的資源,而後調用您須要的AuthorizeAsync重載。 例如:函數

public async Task<IActionResult> Edit(Guid documentId)
{
    Document document = documentRepository.Find(documentId);

    if (document == null)
    {
        return new HttpNotFoundResult();
    }

    if (await authorizationService.AuthorizeAsync(User, document, "EditPolicy"))
    {
        return View(document);
    }
    else
    {
        return new ChallengeResult();
    }
}
 

編寫一個資源處理程序

  爲基於資源的受權編寫處理程序與編寫一個簡單的需求處理程序沒有太大的不一樣。 您建立一個需求,而後爲需求實現一個處理程序,指定前面的需求以及資源類型。 例如,可能接受Document資源的處理程序將以下所示:ui

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方法中註冊你的處理程序;spa

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類做爲資源;code

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狀態碼,或將用戶重定向到交互式瀏覽器客戶端的登陸頁面。

相關文章
相關標籤/搜索