.Net Core實現(xiàn)JWT授權認證
關于JWT的基本概念,如果有不清晰的同學,請點擊這里,就不在這里贅述了。接下來聊聊JWT是怎么發(fā)揮作用的。
第一,安裝nuget包
Microsoft.AspNetCore.Authentication.JwtBearer
第二,配置【Startup】
首先是【ConfigureServices】方法,下面要寫一大堆進去
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(x =>
{
x.RequireHttpsMetadata = false;
x.SaveToken = true;
x.TokenValidationParameters = new TokenValidationParameters()
{
ValidateLifetime = true,
LifetimeValidator = (notBefore, expires, securityToken, validationParameters) =>
{
bool t = DateTime.UtcNow < expires;
return t;
},
ValidateAudience = false,
ValidateIssuer = true,
ValidIssuer = jwtConfig.Issuer,
ValidateIssuerSigningKey = true,
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwtConfig.Key)),
};
});雖然看起來多,實際上邏輯很清晰,我在這里簡單解釋一下:
- RequireHttpsMetadata:獲取或設置元數(shù)據(jù)地址或權限是否需要HTTPS,默認為true
- SaveToken:是否將信息存儲在token中
- TokenValidationParameters:這部分網(wǎng)上有很多版本,其中大部分都是寫滿的,但這對新手不太友好;而且也不是必須寫滿。先解釋一些代碼里的驗證開關(設置true、false的我稱為驗證開關)
- ValidateLifetime——是否驗證過期時間
- ValidateAudience——是否驗證被發(fā)布者
- ValidateIssuer——是否驗證發(fā)布者
- ValidateIssuerSigningKey——是否驗證簽名
查看框架代碼你會發(fā)現(xiàn)更多的驗證開關,這里就不一一解釋了:

然后在【Configure】添加引用:
app.UseAuthentication(); app.UseAuthorization();
這里的順序不能顛倒。第一行是開啟身份驗證,第二行是開啟授權。
第三,配置
JWT需要進行一些簡單的配置來確保安全,至于配置寫在哪里都可以,我是放在appsettings內(nèi):
"JWT": {
"Issuer": "發(fā)布者,一般是一個域名",
"Key": "一個新的guid",
"Expires": 600(秒)
}第四,生成JWT
為了方便大家理解,我這邊直接上代碼:
public static string GetToken(IOptions<JwtConfig> _options, dynamic customer)
{
var claims = new[] {
new Claim(ClaimTypes.Name,"JWT"),
new Claim("ID",customer.ID),
new Claim("WxOpenID",customer.WxOpenID),
new Claim("Father",customer.Father)
};
var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_options.Value.Key));
var credentials = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
var token = new JwtSecurityToken(
issuer: _options.Value.Issuer,
claims: claims,
expires: DateTime.UtcNow.AddMinutes(_options.Value.Expires),
signingCredentials: credentials);
return new JwtSecurityTokenHandler().WriteToken(token);
}如果在token中想要攜帶某些參數(shù),可以使用Claim進行封裝。
接下來還有3個小步驟:
- 1、對配置文件中的key進行加密,得到對稱加密key。
- 2、使用上一步得到的結果生成數(shù)字證書。
- 3、配置token的內(nèi)容。
最后,就可以生成jwt并且返回了。
第五,獲取JWT內(nèi)容
正常情況下,JWT除了做驗證以外,還要有一些參數(shù)做輔助。上面說了參數(shù)傳遞是通過定義claim實現(xiàn)的,那么怎么合法的解析呢?還是直接上代碼:
public static JwtInfo GetInfoFromToken(string token = null)
{
if (token is null)
return null;
string tokenStr = token.Replace("Bearer ", "");
var handler = new JwtSecurityTokenHandler();
var payload = handler.ReadJwtToken(tokenStr).Payload;
var claims = payload.Claims;
JwtInfo info = new JwtInfo()
{
ID = claims.First(claim => claim.Type == "ID")?.Value,
WxOpenID = claims.First(claim => claim.Type == "WxOpenID")?.Value,
Father = claims.First(claim => claim.Type == "Father")?.Value
};
return info;
}這一段沒什么好講的,對應的名字拿到對應的參數(shù)。不過如果參數(shù)不存在這里會報錯,所以盡量規(guī)范一點,首尾呼應。
第六,代碼應用
JWT也生成了,同時也可以反向解析傳遞的參數(shù)了,該如何應用到代碼中去呢?這里要用到特性。
為需要進行驗證的控制器添加【Authorize】特性,這個控制器下的所有方法在外部調(diào)用時就都需要JWT認證才可順利調(diào)用,否則返回401(未授權)。如果不是全部方法都需要認證,那么可以為方法添加【AllowAnonymous】特性來忽略認證限制,如圖:

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
Asp.net TreeView來構建用戶選擇輸入的方法 推薦
選擇優(yōu)于輸入,這是一般人的共識,面對繁多的數(shù)據(jù),提供良好的選擇界面,一方面增強用戶的界面體驗,一方面也提高了數(shù)據(jù)的準確性,更節(jié)省了用戶的寶貴時間。2009-12-12
ASP.NET Core如何實現(xiàn)簡單的靜態(tài)網(wǎng)站滾動更新
這篇文章主要給大家介紹了關于ASP.NET Core如何實現(xiàn)簡單的靜態(tài)網(wǎng)站滾動更新的相關資料,文中給出了詳細實現(xiàn)的代碼,對需要的朋友來說很實用,需要的朋友可以參考下2021-07-07
Entity?Framework生成DataBase?First模式
本文詳細講解了Entity?Framework生成DataBase?First模式的方法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-03-03
.NET中用ICSharpCode.TextEditor自定義代碼折疊與高亮
這篇文章主要給大家介紹了.NET中用ICSharpCode.TextEditor自定義代碼折疊與高亮的相關資料,文中通過示例代碼與圖片介紹的很詳細,需要的朋友可以參考借鑒,下面來一起看看吧。2017-02-02
.NET Core 實現(xiàn)微信小程序支付功能(統(tǒng)一下單)
最近公司研發(fā)了幾個電商小程序,還有一個核心的電商直播,只要是電商一般都會涉及到交易信息,離不開支付系統(tǒng),這里我們統(tǒng)一實現(xiàn)小程序的支付流程。感興趣的朋友跟隨小編一起看看吧2019-09-09
asp.net中利用Jquery+Ajax+Json實現(xiàn)無刷新分頁的實例代碼
本篇文章主要是對asp.net中利用Jquery+Ajax+Json實現(xiàn)無刷新分頁的實例代碼進行了介紹,需要的朋友可以過來參考下,需要對大家有所幫助2014-02-02

