引子
前面說了用第三方類庫生成JWT的故事,給我?guī)砹撕艽蟮姆奖悖⑶椅乙渤兄Z要寫一篇用常規(guī)方法生成JWT的文章(一般都是用微軟官方的類庫),因此才有了這篇文章。
另外,在前面的文章中,我要糾正一下一些錯誤JWT的整個結(jié)構(gòu)決定了JWT只能作為臨時的授權(quán)認(rèn)證解決方案,如果對用戶的機密性要求比較高,必須用有狀態(tài)控制管理的解決方案,JWT只能作為一般性方案使用,它的應(yīng)用場合主要是由多個WebAPI構(gòu)成的多進程多線程多接口這樣的微服務(wù)架構(gòu),是為了解決使用狀態(tài)管理帶來的不便才應(yīng)用而生,一般JWT必須和HTTPS配合才會具有安全性。這是因為JWT作為一種可被破解的數(shù)據(jù),只有TLS加密后,才不會被真正破解。
在微軟的Indentiy認(rèn)證框架中(我個人感覺應(yīng)該叫ASP.NET Core Indentity),MVC和WebAPI雖然使用不同的Nuget包,但本質(zhì)是一樣的……廢話不多說了,直接正題開始:有請我們的主角:JwtSecurityTokenHandler(從名字中就知道它和數(shù)據(jù)庫操作有關(guān),JWT中的數(shù)據(jù)一般都是來自用戶數(shù)據(jù)庫,helper一般用來表示資源管理),后面我們會通過它來實現(xiàn)JWT的生成。
實施
和前面一樣,我們這里主要講解最常用的非對稱算法的JWT,這里采用的算法是RSA,當(dāng)然你也可以采用其他算法來達到目標(biāo)。
首先需要安裝nuget包Microsoft.AspNetCore.Authentication.JwtBearer
,當(dāng)然,有的文章會讓你安裝一個System.IdentityModel.Tokens.JWT
的包,這個完全不需要,因為前面的包已經(jīng)包含后者了,你只要在引用包以后,構(gòu)建一下工程,在dubug目錄里面找到項目生成文件,就會發(fā)現(xiàn)這個dll被放進去了。
由于ASP.NET Core是以依賴注入為主的,而這個包作為一個Service(服務(wù)),需要使用其自身提供的擴展方法來注入ASP.NET Core 的WebApplication的Service對象(IOC容器)中進行集中管理。文章來源:http://www.zghlxwxcb.cn/news/detail-426240.html
點擊查看實現(xiàn)代碼
builder.Services.AddAuthentication()..AddJwtBearer(jwtOptions =>{
jwtOptions.Authority = "https://jwtserver.test.net";
//jwtOptions.Audience = "jwtresouce";
jwtOptions.TokenValidationParameters = new TokenValidationParameters()
{
ValidateIssuer = true,
ValidateAudience = true,
ValidateLifetime = true,
ValidateIssuerSigningKey = true,
ValidIssuer = builder.Configuration["Jwt:Issuer"],//發(fā)行者
ValidAudience = builder.Configuration["Jwt:Audience"], //訂閱者
IssuerSigningKey = new RsaSecurityKey(RSA.Create(2048)) //jwt簽名算法
};
})
- 先創(chuàng)建一個用來生成JWT的
JwtSecurityTokenHandler
對象,為后面的工作提供基礎(chǔ) - 再創(chuàng)建一個數(shù)組,用來存放用戶信息
- 創(chuàng)建
SecurityTokenDescriptor
對象,設(shè)置JWT的加密算法,有效期等屬性 - 調(diào)用之前創(chuàng)建的
JwtSecurityTokenHandler
對象的CreateToken
方法,創(chuàng)建一個令牌對象,再調(diào)用WriteToken
方法,獲得到字符串格式的JWT - 返回結(jié)果
點擊查看實現(xiàn)代碼
[HttpPost]
public string CreateJwtSecurityToken()
{
var tokenHandler = new JwtSecurityTokenHandler();
var mookdata = new Dictionary<string, string>();
mookdata[ClaimTypes.Name] = "John Doe";
mookdata[ClaimTypes.Email] = "johndoe@example.com";
mookdata[ClaimTypes.Role] = "vistor";
var claims = new Claim[mookdata.Count - 1];
foreach (var item in mookdata)
{
for (int i = 0; i < claims.Length; i++)
{
claims[i] = new Claim(item.Key, item.Value);
}
}
var tokenDescriptor = new SecurityTokenDescriptor
{
Subject = new ClaimsIdentity(claims),
Expires = DateTime.UtcNow.AddDays(7),
SigningCredentials = new SigningCredentials(new RsaSecurityKey(RSA.Create(2048)),
SecurityAlgorithms.RsaSha256Signature)
};
var token = tokenHandler.CreateToken(tokenDescriptor);
var tokenString = tokenHandler.WriteToken(token);
return tokenString;
}
總結(jié)
上述講到的方法一般都是比較常用的方法(這個好像是來自微軟官方文檔),先對于上篇文章,它相對比較靈活,不會涉及到x509證書的問題,而且解決方案比較多,容易應(yīng)用。
關(guān)于生成JWT,我也是簡單的了解和使用,因此層次不少太深,如果讀者在其中發(fā)現(xiàn)了問題,也歡迎各位提出寶貴的意見,謝謝。
關(guān)于JWT,我想說這只是WebAPI授權(quán)鑒權(quán)的開端,不是終點,如果有時間,我會再寫一篇結(jié)合JWT來授權(quán)鑒權(quán)的文章,來更好的理解JWT的應(yīng)用,希望我的文章會給您帶來幫助,讓我們一起期待吧!文章來源地址http://www.zghlxwxcb.cn/news/detail-426240.html
到了這里,關(guān)于AspNetCore 成長雜記(一):JWT授權(quán)鑒權(quán)之生成JWT(其二)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!