CZGL.Auth: ASP.NET Core Jwtロール認可クイック構成ライブラリ

4838 ワード

CZGL.Auth


バグが見つかった場合、1人のユーザーしかログインできなくなり、複数のユーザーが同時にログインできなくなります.
ハハハハハハハハハハハハハハハハハハハハハハハハハハ
よく最適化するつもりで、土曜日と日曜日にBugを修正して、テストをしてから出して、ははははははははははははははははは.
新しいオープンソースアドレス:https://github.com/whuanle/CZGL.Auth私のコードはあまりにもクズだから、大物たちは指摘してください.
CZGL.AuthはJwtに基づいて実装された高速ロールライセンスライブラリ、ASP.Net CoreのIdentityのデフォルトのライセンスはCookieです.Jwtライセンスは、基本的な実装とインタフェースのみを提供し、ロールライセンスやコンテキストブロックなどを独自に実装する必要があります.
IdentityServer 4などのサードパーティのオープンソースクラスライブラリを使用すると、複雑すぎて学習コストと開発コストが高くなります.
そこで暇な時間に、このライブラリを書きました.
  • ロール認可に基づく
  • APIごとに
  • を許可できる
  • リアルタイム更新権限
  • クイック構成
  • 使用方法:
    NugetでCZGLを検索.Auth、インストールバージョン1.0.0、ASP.NET Core 2.x.

    注入サービス


    スタータープでcs中
    using CZGL.Auth.Services;

    ConfigureServicesでは、注入サービス
                services.AddRoleService();

    サービスの設定


    Programファイルで、Webサイトを起動する前にロール認可サービスを構成する方法を作成します.
    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
                    {
                    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では、ロールを追加または削除できます.

    ログイン、証明書発行


    AccountControl 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
                    });
            }