ASP.NET Core 基於 JWT 的認證(二) 上一節我們對 Jwt 的一些基礎知識進行了一個簡單的介紹,這一節我們將詳細的講解,本次我們將詳細的介紹一下 Jwt 在 .Net Core 上的實際運用。 環境 .Net Core 2.2 Visual Studio 2017 ASP.NET C ...
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.使用非關係型資料庫Redis對jwt信息的更新和替換
當然,我在後期的文章中也會講解如何使用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中取出我們的信息也非常的簡單,利用依賴註入,使用
C# services.AddTransient<IGetInfoFromToken, GetInfoFromToken>();
自己創建號這兩個介面和類,對httpcontext進行截斷,從httpcontext.user中就可以直接取出我們需要的payload。當然也可以使用中間件的方式,這裡我們就不再用篇幅進行敘述了。
如果我的文章幫到了你,請幫忙點個贊,點個關註。謝謝!
我的掘金:WarrenRyan
我的簡書:WarrenRyan
歡迎關註我的博客獲得第一時間更新 https://blog.tity.online
我的Github:StevenEco
我的博客園:WarrenRyan