.Net Core實現(xiàn)JWT授權(quán)認證
關(guān)于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è)置元數(shù)據(jù)地址或權(quán)限是否需要HTTPS,默認為true
- SaveToken:是否將信息存儲在token中
- TokenValidationParameters:這部分網(wǎng)上有很多版本,其中大部分都是寫滿的,但這對新手不太友好;而且也不是必須寫滿。先解釋一些代碼里的驗證開關(guān)(設(shè)置true、false的我稱為驗證開關(guān))
- ValidateLifetime——是否驗證過期時間
- ValidateAudience——是否驗證被發(fā)布者
- ValidateIssuer——是否驗證發(fā)布者
- ValidateIssuerSigningKey——是否驗證簽名
查看框架代碼你會發(fā)現(xiàn)更多的驗證開關(guān),這里就不一一解釋了:
然后在【Configure】添加引用:
app.UseAuthentication(); app.UseAuthorization();
這里的順序不能顛倒。第一行是開啟身份驗證,第二行是開啟授權(quán)。
第三,配置
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、使用上一步得到的結(jié)果生成數(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; }
這一段沒什么好講的,對應(yīng)的名字拿到對應(yīng)的參數(shù)。不過如果參數(shù)不存在這里會報錯,所以盡量規(guī)范一點,首尾呼應(yīng)。
第六,代碼應(yīng)用
JWT也生成了,同時也可以反向解析傳遞的參數(shù)了,該如何應(yīng)用到代碼中去呢?這里要用到特性。
為需要進行驗證的控制器添加【Authorize】特性,這個控制器下的所有方法在外部調(diào)用時就都需要JWT認證才可順利調(diào)用,否則返回401(未授權(quán))。如果不是全部方法都需要認證,那么可以為方法添加【AllowAnonymous】特性來忽略認證限制,如圖:
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Asp.net TreeView來構(gòu)建用戶選擇輸入的方法 推薦
選擇優(yōu)于輸入,這是一般人的共識,面對繁多的數(shù)據(jù),提供良好的選擇界面,一方面增強用戶的界面體驗,一方面也提高了數(shù)據(jù)的準確性,更節(jié)省了用戶的寶貴時間。2009-12-12ASP.NET Core如何實現(xiàn)簡單的靜態(tài)網(wǎng)站滾動更新
這篇文章主要給大家介紹了關(guān)于ASP.NET Core如何實現(xiàn)簡單的靜態(tài)網(wǎng)站滾動更新的相關(guān)資料,文中給出了詳細實現(xiàn)的代碼,對需要的朋友來說很實用,需要的朋友可以參考下2021-07-07Entity?Framework生成DataBase?First模式
本文詳細講解了Entity?Framework生成DataBase?First模式的方法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-03-03.NET中用ICSharpCode.TextEditor自定義代碼折疊與高亮
這篇文章主要給大家介紹了.NET中用ICSharpCode.TextEditor自定義代碼折疊與高亮的相關(guān)資料,文中通過示例代碼與圖片介紹的很詳細,需要的朋友可以參考借鑒,下面來一起看看吧。2017-02-02.NET Core 實現(xiàn)微信小程序支付功能(統(tǒng)一下單)
最近公司研發(fā)了幾個電商小程序,還有一個核心的電商直播,只要是電商一般都會涉及到交易信息,離不開支付系統(tǒng),這里我們統(tǒng)一實現(xiàn)小程序的支付流程。感興趣的朋友跟隨小編一起看看吧2019-09-09asp.net中利用Jquery+Ajax+Json實現(xiàn)無刷新分頁的實例代碼
本篇文章主要是對asp.net中利用Jquery+Ajax+Json實現(xiàn)無刷新分頁的實例代碼進行了介紹,需要的朋友可以過來參考下,需要對大家有所幫助2014-02-02