.Net Core JWT 動態設置接口與權限


通過上一篇.Net Core官方的 JWT 授權驗證學習到了JWT的授權。可以發現一個問題,就是如果每個接口可以使用的角色都是寫死的,這樣如果有所修改會非常麻煩,雖然用policy可以一定程度上緩解,但是還是不能根治。

所以,就需要動態的設置接口與權限,由我們自己來處理。

我們先創建一個類 PermissionRequirement 繼承接口 IAuthorizationRequirement,這個類是接口與角色的關系類,里面的字段可以按自己的需要添加。

public class PermissionRequirement : IAuthorizationRequirement
{
  public string Url { get; set; }
  public List<string> Roles { get; set; }
}

之后創建一個處理類 PermissionHandler 繼承 AuthorizationHandler 類,來處理請求中接口和角色權限的關系。

public class PermissionHandler : AuthorizationHandler<PermissionRequirement>
{
    protected override async Task HandleRequirementAsync(AuthorizationHandlerContext context, PermissionRequirement requirement)
    {
        //模擬從數據庫或者緩存中取出的訪問url的權限數據
        var roles = new List<PermissionRequirement>();
        roles.Add(new PermissionRequirement() { Url = "weatherforecast", Roles = new List<string>() { "system" } });
        //JWT的token中的聲明等信息都會自動解析在context中
        var resource = ((Microsoft.AspNetCore.Routing.RouteEndpoint)context.Resource).RoutePattern;
        foreach(var t in context.User.Identities)
        {
            foreach(var claim in t.Claims)
            {
                //通過Type可以判斷聲明的類型,這里處理role的聲明獲取角色信息
                if(claim.Type == ClaimTypes.Role)
                {
                    if(roles.Exists(x => x.Roles.Exists(role => role == claim.Value) && x.Url == resource.RawText.ToLower()))
                    {
                        context.Succeed(requirement);
                        return;
                    }
                }
            }
        }
        context.Fail();
        return;
    }
}

在 Startup 類中其他都不變,只需要添加在 ConfigureServices 方法中添加上如下代碼即可,通過以來注入 PermissionHandler 類來替換成我們的處理類。

services.AddAuthorization(option => {
    //option.AddPolicy("adminOrSystem", policy => policy.RequireRole("admin", "system"));
    option.AddPolicy("Permission", policy => policy.AddRequirements(permissionRequirement));
});
services.AddSingleton<IAuthorizationHandler, PermissionHandler>();
// 將授權必要類注入生命周期內
services.AddSingleton(permissionRequirement);

最后只需要在接口或控制器上添加 [Authorize(Policy = "Permission")] 就可以啦,只要有該特性的接口訪問都會走我們的處理類 PermissionHandler 判斷接口和角色的關系,從而實現了動態設置接口和權限的要求。

我這里的代碼比較的簡陋,最低限度的實現,可以自己根據需求完善。也可以看下面的參考文章。

參考文章:

ASP.NET Core 使用 JWT 自定義角色/策略授權需要實現的接口

從壹開始前后端分離[.NetCore] 37 ║JWT完美實現權限與接口的動態分配

 


免責聲明!

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



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