1. 程式人生 > >CZGL.Auth: ASP.NET Core Jwt角色授權快速配置庫

CZGL.Auth: ASP.NET Core Jwt角色授權快速配置庫

CZGL.Auth
CZGL.Auth 是一個基於 Jwt 實現的快速角色授權庫,ASP.Net Core 的 Identity 預設的授權是 Cookie。而 Jwt 授權只提供了基礎實現和介面,需要自己實現角色授權和上下文攔截等。

使用第三方開源類庫,例如 IdentityServer4 ,過於複雜,學習成本和開發成本較高。

於是空閒時間,寫了這個庫。

基於角色授權
每個API均可授權
實時更新許可權
快速配置
使用方法:

Nuget 中搜索 CZGL.Auth ,安裝 1.0.0版本,適用於 ASP.NET Core 2.x。

注入服務
在 Startup.cs 中

using CZGL.Auth.Services;

ConfigureServices 中,注入服務

        services.AddRoleService();

配置服務
在 Program 檔案中建立一個方法,在啟動網站前配置角色授權服務:

使用 AuthBuilder 可以配置授權認證的配置

引入

using CZGL.Auth.Services;
using CZGL.Auth.Models;
using CZGL.Auth.Interface;
你可以像這樣快速配置:

        new AuthBuilder()
           .Security() 
           .Jump()
           .Time(TimeSpan.FromMinutes(20))
           .DefaultRole("user")
           .End();

// 無需接收返回值,直接這樣寫即可
Security 中配置 金鑰、預設使用者的角色、Token頒發者、Token訂閱者。

​ 金鑰應當使用私鑰證書的文字內容;請設定一個無用的預設角色或者亂填一個無用的字串,在認證失效或其它原因是,會使用此角色;這個預設角色是存放在系統中的。

Jump 中填寫登入URL、無權訪問時跳轉URL和是否開啟跳轉功能。

如果不開啟,則在失敗時直接返回 401 ;如果開啟,在使用者沒有登入或憑證已經失效時,會跳轉到相應頁面。

Time 中填寫憑證失效的時間,即頒發的憑證有效時間,可以以分鐘、秒為單位。一般都是設定20/30分鐘。

DefaultRole 設定預設角色,這個預設角色是給為登入或憑證失效時設定,或者頒發憑證後系統刪除了這個角色等使用。亂填就行,不要跟真正的使用者角色名稱一致即可。

角色授權
使用 RolePermission.AddRole() 可以增加一個角色,

        var usera = new Role()
        {
            RoleName = "supperadmin",
            Apis = new List<IApiPermission>
            {
            new ApiPermission{Name="A",Url="/api/Test/A" },
            new ApiPermission{Name="AB",Url="/api/Test/AB" },
            new ApiPermission{Name="AC",Url="/api/Test/AC" },
            new ApiPermission{Name="ABC",Url="/api/Test/ABC" }
            }
        };
        RolePermission.AddRole(usera);

RoleName :角色名稱

Apis:角色能夠訪問的API

IApiPermission:一個API,Name API名稱,Url API地址。

校驗角色和API地址時,不區分大小寫。

角色會儲存到記憶體中,你可以隨時新增或刪除角色。例如從資料庫中讀取許可權儲存到系統中。

為了安全和避免同步問題,只允許以角色為單位操作。

RolePermission 中可以新增或刪除角色。

登入、頒發憑證
建立 AccountController API控制器

    private readonly AuthorizationRequirement _requirement;
    public AccountController(AuthorizationRequirement requirement)
    {
        _requirement = requirement;
    }

如果你不是用 AuthorizationRequirement 注入,那麼頒發的會是上面設定的預設使用者,這可能會導致授權問題。

登入:

    [HttpPost("Login")]
    public JsonResult Login(string username, string password)
    {
        // 中資料庫中判斷賬號密碼是否正確,並獲取使用者所屬角色等角色
        var user = UserModel.Users.FirstOrDefault(x => x.UserName == username && x.UserPossword == password);
        
        if (user == null)
            return new JsonResult(
                new ResponseModel
                {
                    Code = 0,
                    Message = "登陸失敗!"
                });

        // 例項化加密和頒發 Token的類
        EncryptionHash hash = new EncryptionHash();

        // 將使用者標識儲存到系統中
        _requirement.SetUserRole(user.Role);


        //// 配置使用者標識
        //// 方法一
        //var userClaims = new Claim[]
        //{
        //    new Claim(ClaimTypes.Name,user.UserName),
        //    new Claim(ClaimTypes.Role,user.Role),
        //    new Claim(ClaimTypes.Expiration,DateTime.Now.AddMinutes(TimeSpan.FromMinutes(20)).ToString()),
        //};

        // 方法二
        var userClaims = hash.GetClaims(username, user.Role);


        // 頒發 token
        var identity = hash.GetIdentity(userClaims);
        var jwt = hash.BuildJwtToken(userClaims);
        var token = hash.BuildJwtResponseToken(jwt);


        return new JsonResult(
            new ResponseModel
            {
                Code = 200,
                Message = "登陸成功!請注意儲存你的 Token 憑證!",
                Data = token
            });
    }