.Net Core實(shí)現(xiàn)JWT授權(quán)認(rèn)證
關(guān)于JWT的基本概念,如果有不清晰的同學(xué),請點(diǎn)擊這里,就不在這里贅述了。接下來聊聊JWT是怎么發(fā)揮作用的。
第一,安裝nuget包
Microsoft.AspNetCore.Authentication.JwtBearer
第二,配置【Startup】
首先是【ConfigureServices】方法,下面要寫一大堆進(jìn)去
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)), }; });
雖然看起來多,實(shí)際上邏輯很清晰,我在這里簡單解釋一下:
- RequireHttpsMetadata:獲取或設(shè)置元數(shù)據(jù)地址或權(quán)限是否需要HTTPS,默認(rèn)為true
- SaveToken:是否將信息存儲在token中
- TokenValidationParameters:這部分網(wǎng)上有很多版本,其中大部分都是寫滿的,但這對新手不太友好;而且也不是必須寫滿。先解釋一些代碼里的驗(yàn)證開關(guān)(設(shè)置true、false的我稱為驗(yàn)證開關(guān))
- ValidateLifetime——是否驗(yàn)證過期時(shí)間
- ValidateAudience——是否驗(yàn)證被發(fā)布者
- ValidateIssuer——是否驗(yàn)證發(fā)布者
- ValidateIssuerSigningKey——是否驗(yàn)證簽名
查看框架代碼你會發(fā)現(xiàn)更多的驗(yàn)證開關(guān),這里就不一一解釋了:
然后在【Configure】添加引用:
app.UseAuthentication(); app.UseAuthorization();
這里的順序不能顛倒。第一行是開啟身份驗(yàn)證,第二行是開啟授權(quán)。
第三,配置
JWT需要進(jìn)行一些簡單的配置來確保安全,至于配置寫在哪里都可以,我是放在appsettings內(nèi):
"JWT": { "Issuer": "發(fā)布者,一般是一個(gè)域名", "Key": "一個(gè)新的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進(jìn)行封裝。
接下來還有3個(gè)小步驟:
- 1、對配置文件中的key進(jìn)行加密,得到對稱加密key。
- 2、使用上一步得到的結(jié)果生成數(shù)字證書。
- 3、配置token的內(nèi)容。
最后,就可以生成jwt并且返回了。
第五,獲取JWT內(nèi)容
正常情況下,JWT除了做驗(yàn)證以外,還要有一些參數(shù)做輔助。上面說了參數(shù)傳遞是通過定義claim實(shí)現(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ù)不存在這里會報(bào)錯(cuò),所以盡量規(guī)范一點(diǎn),首尾呼應(yīng)。
第六,代碼應(yīng)用
JWT也生成了,同時(shí)也可以反向解析傳遞的參數(shù)了,該如何應(yīng)用到代碼中去呢?這里要用到特性。
為需要進(jìn)行驗(yàn)證的控制器添加【Authorize】特性,這個(gè)控制器下的所有方法在外部調(diào)用時(shí)就都需要JWT認(rèn)證才可順利調(diào)用,否則返回401(未授權(quán))。如果不是全部方法都需要認(rèn)證,那么可以為方法添加【AllowAnonymous】特性來忽略認(rèn)證限制,如圖:
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
asp.net子窗體與父窗體交互實(shí)戰(zhàn)分享
用到了兩個(gè)頁面,其中Default.aspx作為父頁面,Default2.aspx作為子頁面被彈出。Default.aspx頁面上有兩個(gè)TextBox一個(gè)Button通過測試我們可以看出我們保留了先輸入到父窗體中的值,又接收了從子窗體傳遞過來的值2013-02-02Asp.net TreeView來構(gòu)建用戶選擇輸入的方法 推薦
選擇優(yōu)于輸入,這是一般人的共識,面對繁多的數(shù)據(jù),提供良好的選擇界面,一方面增強(qiáng)用戶的界面體驗(yàn),一方面也提高了數(shù)據(jù)的準(zhǔn)確性,更節(jié)省了用戶的寶貴時(shí)間。2009-12-12ASP.NET Core如何實(shí)現(xiàn)簡單的靜態(tài)網(wǎng)站滾動更新
這篇文章主要給大家介紹了關(guān)于ASP.NET Core如何實(shí)現(xiàn)簡單的靜態(tài)網(wǎng)站滾動更新的相關(guān)資料,文中給出了詳細(xì)實(shí)現(xiàn)的代碼,對需要的朋友來說很實(shí)用,需要的朋友可以參考下2021-07-07分享AjaxPro或者Ajax實(shí)現(xiàn)機(jī)制
今天與大家分享AjaxPro或者Ajax實(shí)現(xiàn)機(jī)制,需要的朋友可以參考下。2011-12-12Entity?Framework生成DataBase?First模式
本文詳細(xì)講解了Entity?Framework生成DataBase?First模式的方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-03-03.NET中用ICSharpCode.TextEditor自定義代碼折疊與高亮
這篇文章主要給大家介紹了.NET中用ICSharpCode.TextEditor自定義代碼折疊與高亮的相關(guān)資料,文中通過示例代碼與圖片介紹的很詳細(xì),需要的朋友可以參考借鑒,下面來一起看看吧。2017-02-02.NET Core 實(shí)現(xiàn)微信小程序支付功能(統(tǒng)一下單)
最近公司研發(fā)了幾個(gè)電商小程序,還有一個(gè)核心的電商直播,只要是電商一般都會涉及到交易信息,離不開支付系統(tǒng),這里我們統(tǒng)一實(shí)現(xiàn)小程序的支付流程。感興趣的朋友跟隨小編一起看看吧2019-09-09asp.net中利用Jquery+Ajax+Json實(shí)現(xiàn)無刷新分頁的實(shí)例代碼
本篇文章主要是對asp.net中利用Jquery+Ajax+Json實(shí)現(xiàn)無刷新分頁的實(shí)例代碼進(jìn)行了介紹,需要的朋友可以過來參考下,需要對大家有所幫助2014-02-02