.net core自定義授權處理程序


使用框架:dotnet Core 3.1

語言:C#

適用人群:學習授權處理的人員

原文:.net core自定義授權處理程序-League Of Programmers

Authorization 授權,有什么作用?

當一個請求到達控制器、Action時,用它來判斷該請求是否能夠繼續執行該控制器、Action。例如:發布一篇博文,需要用戶登錄后才能發布,那么就使用 Authorization 來判斷該請求是否有攜帶用戶登錄信息,如果沒有,則不能發布。

dotnet core 里提供了授權框架,允許開發者編寫自己的授權規則,下面我們來編寫一個授權規則,該規則規定,只能是管理員(Administrator)才能訪問Action。

首先需要了解兩個接口 interface:

namespace Microsoft.AspNetCore.Authorization
{
    //
    // 摘要:
    //     Represents an authorization requirement.
    //     無方法的標記服務,以及用於跟蹤授權是否成功的機制
    public interface IAuthorizationRequirement
    {
    }
}
/// <summary>
/// Classes implementing this interface are able to make a decision if authorization
/// is allowed.
/// </summary>
public interface IAuthorizationHandler
{
    /// <summary>
    /// Makes a decision if authorization is allowed.
    /// </summary>
    /// <param name="context">The authorization information.</param>
    //  負責檢查是否滿足要求
    Task HandleAsync(AuthorizationHandlerContext context);
}

接口 IAuthorizationRequirement 表示授權的要求。我們來寫一個類,實現這個接口:

//  這個接口沒有任何參數,僅僅表示要求是管理員,現在沒有任何用處
//  所以我們需要寫一個處理程序來實現這個要求,往下看
public class IsAdministratorRequirement : IAuthorizationRequirement
{
}

接口 IAuthorizationHandler 用於實現如何檢查要求,我們可以使用已經實現了該接口的抽象類 AuthorizationHandler,我們寫一個新的類來繼承該抽象類:

//  這個類繼承了抽象類 AuthorizationHandler,它的泛型參數規定了要處理哪個要求
public class IsAdministratorHandler : AuthorizationHandler<IsAdministratorRequirement>
{
    //  別忘了抽象方法,我們的處理邏輯就寫在這個方法里
    protected override Task HandleRequirementAsync
(AuthorizationHandlerContext context, IsAdministratorRequirement requirement)
    {}
}

在方法 HandleRequirementAsync (AuthorizationHandlerContext context, IsAdministratorRequirement requirement)中,參數 AuthorizationHandlerContext context 攜帶了用戶信息 ClaimsPrincipal, 我們可以通過

var user = context.User;

來獲取到當前請求中攜帶的用戶信息。至於用戶信息是如何放到 context.User 里面的,這個不是本文的內容,是 權限 (Authentication) 的范圍。

怎么表示授權成功或失敗?

在方法處理方法 HandleRequirementAsync 中,調用

context.Succeed(requirement);

參數中傳入處理的要求,則視為授權成功,同時你可以繼續執行其他操作或是直接結束這個方法。

執行

context.Fail();

視為授權失敗,就算是在這之前執行過 context.Succeed(requirement) 也視為授權失敗。但此時我們只是編寫了授權規則,需要將他們配置為授權策略,才能夠使用它們。

配置為授權策略

ConfigureServices 中配置授權策略,如下:

//  添加授權處理程序 IsAdministratorHandler 到DI
services.AddSingleton<IAuthorizationHandler, IsAdministratorHandler>();
//  給該授權要求一個策略名
services.AddAuthorizationCore(options =>
{
    options.AddPolicy("授權策略名", policy => policy.Requirements.Add(new IsAdministratorRequirement()));
});

通過以上兩句后,我們就可以通過策略名來使用這個策略了。我們直接在需要的控制器、Action上街上特性

[Authorize(policy: "授權策略名")]
public class AdministratorController
{}

如上,如果該策略授權成功,則繼續執行接下來的代碼,如果失敗,則會直接返回 401 響應狀態碼。

以上只是簡單的用法,更多詳細的用法見
官網教程-基於策略的授權


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM