ASP.NET Core 基於JWT的認證(二)

ASP.NET Core 基於JWT的認證(二)

上一節咱們對 Jwt 的一些基礎知識進行了一個簡單的介紹,這一節咱們將詳細的講解,本次咱們將詳細的介紹一下 Jwt.Net Core 上的實際運用。html

環境

  • .Net Core 2.2
  • Visual Studio 2017
  • ASP.NET Core WebAPI2

在上一篇文章中,咱們詳細的介紹了JWT的知識,這一次,咱們將進行一次實戰的訓練,這一塊將會有三個部分組成。分別是:
1.如何使用微軟官方提供的庫實現jwt
2.如何自定義一個Jwt認證類
3.使用非關係型數據庫Redisjwt信息的更新和替換
固然,我在後期的文章中也會講解如何使用IdentityServer4去進行咱們的權限控制。
在本文中,你將會學到如何使用微軟官方提供的庫進行Jwt的簽發、驗證以及權限控制。咱們使用的WebApi做爲演示程序。git

配置信息的存儲

一般來講,咱們會把數據庫等等一系列的配置放在咱們的appsettings.json中,咱們也嘗試着將咱們的jwt私鑰等存在其中。github

"JwtSettings": {
    "Issuer": "admin",
    "Audience": "user",
    "SecretKey": "ahfuawivb754huab21n5n1"
  }

固然你也能夠把更多的配置放進去。
而後咱們用依賴注入的方法,將配置文件注入到咱們的類對象中。咱們建立一個JwtSetting類,而且在服務中進行注入。
類對象數據庫

public class JwtSettings
    {
        /// <summary>
        /// 證書頒發者
        /// </summary>
        public string Issuer { get; set; }

        /// <summary>
        /// 容許使用的角色
        /// </summary>
        public string Audience { get; set; }

        /// <summary>
        /// 加密字符串
        /// </summary>
        public string SecretKey { get; set; }
    }

注入json

services.Configure<JwtSettings>(Configuration.GetSection("JwtSettings"));
            JwtSettings setting = new JwtSettings();
            Configuration.Bind("JwtSettings", setting);
            JwtHelper.Settings = setting;

想必這裏的代碼你們確定是看的輕車熟路了,很是的簡單。
接下來咱們對Jwt的簽發製做一個JwtHelper類。c#

Jwt的簽發

這一塊,你能夠上網去查看權限模型的一些介紹。app

這裏我簡要的作一個介紹:
Claim是什麼呢,他就是一個用於描述一個具體的實體對象的一些描述性的字段。asp.net

ClaimsIdentity就是用於指明Claim中所存儲的內容的合集,好比咱們的身份證,年齡、性別、身份證號碼等就組成了咱們的身份證。ide

ClaimsPrincipal咱們稱爲「證件當事人」,也就是咱們以前聲明的東西的一個合計,相似,好比說你可能有駕照、身份證、醫保卡等等,而所持有這些的人就叫作ClaimsPrincipal加密

一些代碼是一個普通的結構,你們能夠按照這種模板進行修改模型,從而建立本身的jwt結構

代碼:

public class JwtHelper
    {
        private static JwtSettings settings;
        public static JwtSettings Settings { set { settings = value; } }
        public static string create_Token(TokenPayload user)
        {
            //這裏就是聲明咱們的claim
            var claims = new Claim[] {
                        new Claim(ClaimTypes.Name, user.Name),
                        new Claim(ClaimTypes.Role, user.Role),
                        new Claim(ClaimTypes.Sid,user.Sid.ToString())
                    };
            var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(settings.SecretKey));
            var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);

            var token = new JwtSecurityToken(
                issuer: settings.Issuer,
                audience: settings.Audience,
                claims: claims,
                expires: DateTime.Now.AddDays(1),
                signingCredentials: creds);
            var Token = new JwtSecurityTokenHandler().WriteToken(token);
            return Token;
        }
    }

JWT認證

在這裏,你可使用咱們下一節所遇到的自定義認證,不過咱們仍是先學着使用咱們最爲普通的官方方法。具體的操做很是簡單,只須要在咱們的容器service中注入一下就能夠了。

services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
            .AddJwtBearer(config =>
            {
                config.TokenValidationParameters = new TokenValidationParameters
                {
                    ValidateIssuer = true,//是否驗證Issuer
                    ValidateAudience = true,//是否驗證Audience
                    ValidateLifetime = true,//是否驗證失效時間
                    ValidateIssuerSigningKey = true,//是否驗證SecurityKey
                    ValidAudience = setting.Audience,//Audience
                    ValidIssuer = setting.Issuer,//Issuer,這兩項和前面簽發jwt的設置一致
                    IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(setting.SecretKey))//拿到SecurityKey
                };
            });

這樣,就完成了咱們的jwt認證過程。
若是咱們須要從token中取出咱們的信息也很是的簡單,利用依賴注入,使用
C# services.AddTransient<IGetInfoFromToken, GetInfoFromToken>();
本身建立號這兩個接口和類,對httpcontext進行截斷,從httpcontext.user中就能夠直接取出咱們須要的payload。固然也可使用中間件的方式,這裏咱們就再也不用篇幅進行敘述了。

若是個人文章幫到了你,請幫忙點個贊,點個關注。謝謝!

個人掘金:WarrenRyan

個人簡書:WarrenRyan

歡迎關注個人博客得到第一時間更新 https://blog.tity.online

個人Github:StevenEco

個人博客園:WarrenRyan

相關文章
相關標籤/搜索