使用框架: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 響應狀態碼。
以上只是簡單的用法,更多詳細的用法見
官網教程-基於策略的授權