.net使用jwt進(jìn)行身份認(rèn)證的流程記錄
什么是身份認(rèn)證和鑒權(quán)
舉個(gè)例子
假設(shè)有這么一個(gè)小區(qū),小區(qū)只允許持有通行證的人進(jìn)入,陌生人如果想直接進(jìn)入小區(qū)會(huì)被保安攔住,他必須先辦理通行證才會(huì)被允許進(jìn)入
類比身份認(rèn)證和鑒權(quán)體系
一個(gè)人要訪問(wèn)我的一個(gè)機(jī)密的接口,我首先需要知道你是誰(shuí),搞清楚你是誰(shuí)的過(guò)程就是身份認(rèn)證,如果我搞不清楚你是誰(shuí),那你就是陌生人,身份認(rèn)證失敗。
身份認(rèn)證通過(guò),并不一定就允許訪問(wèn)我的機(jī)密的接口,因?yàn)樯矸菡J(rèn)證只是讓我知道了你是誰(shuí),但是我還不知道你有沒(méi)有訪問(wèn)我接口的權(quán)限,因此還需要進(jìn)行鑒權(quán)。
鑒權(quán)就是在身份認(rèn)證的基礎(chǔ)上來(lái)查閱你是否有訪問(wèn)某接口的權(quán)限,有權(quán)限才允許訪問(wèn)。
jwt工作流程
在基于jwt策略的身份認(rèn)證和鑒權(quán)體系中
機(jī)密的接口只允許有token的人訪問(wèn)
它的工作流程是這樣的
首先你向授權(quán)服務(wù)器請(qǐng)求一個(gè)token,服務(wù)器對(duì)你進(jìn)行校驗(yàn),校驗(yàn)成功則給你一個(gè)token
之后你每次訪問(wèn)接口都帶上這個(gè)服務(wù)器給的token,以此來(lái)證明你經(jīng)過(guò)了校驗(yàn)并有權(quán)訪問(wèn)這個(gè)接口,這樣你才能被放行
token是如何生成的
token是由服務(wù)器生成的,
用戶請(qǐng)求token的時(shí)候,拿著自己的一些信息給服務(wù)器
服務(wù)器有它的密鑰基于一些加密算法對(duì)用戶的信息進(jìn)行加密,之后生成一個(gè)token給用戶。
jwt三部分
jwt的toke由三部分,header密文,payload密文和簽名
header
header存放兩個(gè)信息
1.聲明加密的算法
2.聲明類型
像這樣:
{
“alg”: “HS256”,
“typ”: “JWT”
}
payload
存放一些自定義的信息,例如用戶的個(gè)人信息,例如用戶名。
注意:不要存密碼等敏感信息,因?yàn)閠oken可以被解密成明文。
signature
簽名,由服務(wù)器使用它的密鑰對(duì)header和payload進(jìn)行加密后的結(jié)果
jwt是如何保證數(shù)據(jù)不會(huì)被篡改的
服務(wù)器對(duì)token解密獲得header、payload和signature,再拿著自己的密鑰對(duì)header和payload進(jìn)行加密,看加密結(jié)果是否和解密出來(lái)的signature相等,如果相等說(shuō)明數(shù)據(jù)沒(méi)有被篡改,如果不等說(shuō)明數(shù)據(jù)已被篡改
由于服務(wù)器的密鑰是不公開(kāi)的,因此認(rèn)為簽名不能偽造,也就是說(shuō),別人無(wú)法通過(guò)header、payload來(lái)加密得到一個(gè)服務(wù)器認(rèn)可的token
.net webapi 的 demo
為了簡(jiǎn)化,這里只做身份認(rèn)證,也就是說(shuō)登錄的用戶就有權(quán)訪問(wèn)所有接口了
在Starup.cs中開(kāi)啟身份認(rèn)證服務(wù)并指定策略為jwt
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme).AddJwtBearer(JwtBearerDefaults.AuthenticationScheme, options => { options.TokenValidationParameters = new TokenValidationParameters { ValidateIssuer = true, ValidateAudience = true, ValidateLifetime = true, ValidateIssuerSigningKey = true, ValidAudience = "xxx", ValidIssuer = "xxx", IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("bc47a26eb9a59406057dddd62d0898f4")), }; });
還需要使用身份認(rèn)證中間件
在需要進(jìn)行身份認(rèn)證的接口或控制器上加上特性[Authorize]
還需要實(shí)現(xiàn)登錄邏輯,準(zhǔn)備一個(gè)Get接口用于測(cè)試
Controller代碼為:
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; using Microsoft.IdentityModel.Tokens; using System; using System.Collections.Generic; using System.IdentityModel.Tokens.Jwt; using System.Linq; using System.Security.Claims; using System.Text; using System.Threading.Tasks; namespace JwtTest.Controllers { [ApiController] [Route("[controller]/[action]")] [Authorize] public class WeatherForecastController : ControllerBase { [HttpGet] public ActionResult Get() { return Ok("ok"); } [HttpPost] [AllowAnonymous] public ActionResult Login([FromBody] LoginViewModel loginViewModel) { //驗(yàn)證用戶名密碼是否正確,錯(cuò)誤則不進(jìn)行后續(xù)操作 { //驗(yàn)證邏輯在此省略 } //驗(yàn)證成功則繼續(xù)運(yùn)行后面代碼,來(lái)生成token //claims是關(guān)于用戶的一些信息,這部分信息將放在payload中,由于token可以被解密,因此不要把密碼放進(jìn)去 var claims = new Claim[] { new Claim(ClaimTypes.Name, loginViewModel.Name) }; //指定生成token所需要的密鑰 SymmetricSecurityKey key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("bc47a26eb9a59406057dddd62d0898f4")); //指定數(shù)字簽名需要使用的密鑰和算法 SigningCredentials credentials = new SigningCredentials(key, SecurityAlgorithms.HmacSha256); //生成token JwtSecurityToken token = new JwtSecurityToken(issuer: "xxx", audience: "xxx", claims: claims, notBefore: DateTime.Now, //token生效時(shí)間 expires: DateTime.Now.AddMinutes(5), //token有效時(shí)間 signingCredentials: credentials); return Ok(new JwtSecurityTokenHandler().WriteToken(token)); } } }
進(jìn)行測(cè)試:
不登錄直接訪問(wèn)Get會(huì)報(bào)401
訪問(wèn)Login會(huì)返回一個(gè)token
要想成功訪問(wèn)Get,需要帶上這個(gè)token,如何使請(qǐng)求帶上這個(gè)token呢?
可以借助postman,
輸入Get接口的路徑
將Authorization類型設(shè)置為Bearer Token,之后將生成的token粘貼到右邊
訪問(wèn)成功
總結(jié)
到此這篇關(guān)于.net使用jwt進(jìn)行身份認(rèn)證的文章就介紹到這了,更多相關(guān).net用jwt身份認(rèn)證內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
asp.net用url重寫URLReWriter實(shí)現(xiàn)任意二級(jí)域名
Asp.net 用url重寫(URLReWriter)實(shí)現(xiàn)任意二級(jí)域名2008-10-10ASP.NET?Core使用EF創(chuàng)建模型(包含屬性、排除屬性、主鍵和生成值)
這篇文章介紹了ASP.NET?Core使用EF創(chuàng)建模型的的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-04-04Asp.net core實(shí)現(xiàn)PushStream視頻流推送
這篇文章介紹了Asp.net core實(shí)現(xiàn)PushStream視頻流推送的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-07-07.aspx中的命名空間設(shè)置實(shí)現(xiàn)代碼
原來(lái)以為.aspx 與.cs文件是屬于同一個(gè)類,今天才意識(shí)到自己錯(cuò)了。2009-04-04.Net項(xiàng)目在Docker容器中開(kāi)發(fā)部署
這篇文章介紹了.Net項(xiàng)目在Docker容器中開(kāi)發(fā)部署的方法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-04-04在AspNetCore中使用極驗(yàn)做行為認(rèn)證的驗(yàn)證流程
這篇文章主要介紹了在AspNetCore中使用極驗(yàn)做行為認(rèn)證的驗(yàn)證流程 ,本文有圖文介紹有實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-09-09Coolite Cool Study 3 MVC + Coolite 的實(shí)現(xiàn)代碼
啊,開(kāi)始以為MVC+Coolite結(jié)合的例子沒(méi)什么難度,但原來(lái)Coolite在MVC中需要特定設(shè)置一下某些屬性才行,費(fèi)了兩個(gè)小時(shí)才算大功告成,具體請(qǐng)看下文。還是先把這個(gè)例子的效果貼上來(lái)再說(shuō)。2009-05-05ASP.NET WebAPI2復(fù)雜請(qǐng)求跨域設(shè)置的方法介紹
這篇文章主要給大家介紹了關(guān)于ASP.NET WebAPI2復(fù)雜請(qǐng)求跨域設(shè)置的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者使用ASP.NET具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07ASP.NET連接數(shù)據(jù)庫(kù)并獲取數(shù)據(jù)方法總結(jié)
這篇文章主要介紹了ASP.NET連接數(shù)據(jù)庫(kù)并獲取數(shù)據(jù)方法,結(jié)合實(shí)例分析總結(jié)了ASP.NET連接數(shù)據(jù)庫(kù)及獲取數(shù)據(jù)的相關(guān)實(shí)現(xiàn)技巧,并附帶了web.config配置文件的使用方法與相關(guān)注意事項(xiàng),需要的朋友可以參考下2015-11-11