上一節咱們對 Jwt 的一些基礎知識進行了一個簡單的介紹,這一節咱們將詳細的講解,本次咱們將詳細的介紹一下 Jwt在 .Net Core 上的實際運用。html
在上一篇文章中,咱們詳細的介紹了JWT的知識,這一次,咱們將進行一次實戰的訓練,這一塊將會有三個部分組成。分別是:
1.如何使用微軟官方提供的庫實現jwt
2.如何自定義一個Jwt認證類
3.使用非關係型數據庫Redis對jwt信息的更新和替換
固然,我在後期的文章中也會講解如何使用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#
這一塊,你能夠上網去查看權限模型的一些介紹。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; } }
在這裏,你可使用咱們下一節所遇到的自定義認證,不過咱們仍是先學着使用咱們最爲普通的官方方法。具體的操做很是簡單,只須要在咱們的容器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