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

WarrenRyan發表於2019-03-18

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

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

環境

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

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

配置資訊的儲存

通常來說,我們會把資料庫等等一系列的配置放在我們的appsettings.json中,我們也嘗試著將我們的jwt私鑰等存在其中。

  "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; }
    }

注入

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

想必這裡的程式碼大家肯定是看的輕車熟路了,非常的簡單。
接下來我們對Jwt的簽發製作一個JwtHelper類。

Jwt的簽發

這一塊,你可以上網去檢視許可權模型的一些介紹。

這裡我簡要的做一個介紹:
Claim是什麼呢,他就是一個用於描述一個具體的實體物件的一些描述性的欄位。

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

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中取出我們的資訊也非常的簡單,利用依賴注入,使用

自己建立號這兩個介面和類,對httpcontext進行截斷,從httpcontext.user中就可以直接取出我們需要的payload。當然也可以使用中介軟體的方式,這裡我們就不再用篇幅進行敘述了。






作  者:WarrenRyan
出  處:https://www.cnblogs.com/WarrenRyan/
關於作者:熱愛數學、熱愛機器學習,喜歡彈鋼琴的不知名小菜雞。
版權宣告:本文版權歸作者所有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連結。若需商用,則必須聯絡作者獲得授權。
特此宣告:所有評論和私信都會在第一時間回覆。也歡迎園子的大大們指正錯誤,共同進步。或者直接私信
聲援博主:如果您覺得文章對您有幫助,可以點選文章右下角推薦一下。您的鼓勵是作者堅持原創和持續寫作的最大動力!


博主一些其他平臺:
微信公眾號:寤言不寐
BiBili——小陳的學習記錄
Github——StevenEco
BiBili——記錄學習的小陳(計算機考研紀實)
掘金——小陳的學習記錄
知乎——小陳的學習記錄

聯絡方式:

電子郵件:cxtionch@live.com

社交媒體聯絡二維碼:

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

相關文章