.net使用jwt進行身份認證的流程記錄
什么是身份認證和鑒權(quán)
舉個例子
假設(shè)有這么一個小區(qū),小區(qū)只允許持有通行證的人進入,陌生人如果想直接進入小區(qū)會被保安攔住,他必須先辦理通行證才會被允許進入
類比身份認證和鑒權(quán)體系
一個人要訪問我的一個機密的接口,我首先需要知道你是誰,搞清楚你是誰的過程就是身份認證,如果我搞不清楚你是誰,那你就是陌生人,身份認證失敗。
身份認證通過,并不一定就允許訪問我的機密的接口,因為身份認證只是讓我知道了你是誰,但是我還不知道你有沒有訪問我接口的權(quán)限,因此還需要進行鑒權(quán)。
鑒權(quán)就是在身份認證的基礎(chǔ)上來查閱你是否有訪問某接口的權(quán)限,有權(quán)限才允許訪問。
jwt工作流程
在基于jwt策略的身份認證和鑒權(quán)體系中
機密的接口只允許有token的人訪問
它的工作流程是這樣的
首先你向授權(quán)服務(wù)器請求一個token,服務(wù)器對你進行校驗,校驗成功則給你一個token
之后你每次訪問接口都帶上這個服務(wù)器給的token,以此來證明你經(jīng)過了校驗并有權(quán)訪問這個接口,這樣你才能被放行
token是如何生成的
token是由服務(wù)器生成的,
用戶請求token的時候,拿著自己的一些信息給服務(wù)器
服務(wù)器有它的密鑰基于一些加密算法對用戶的信息進行加密,之后生成一個token給用戶。
jwt三部分
jwt的toke由三部分,header密文,payload密文和簽名
header
header存放兩個信息
1.聲明加密的算法
2.聲明類型
像這樣:
{
“alg”: “HS256”,
“typ”: “JWT”
}
payload
存放一些自定義的信息,例如用戶的個人信息,例如用戶名。
注意:不要存密碼等敏感信息,因為token可以被解密成明文。
signature
簽名,由服務(wù)器使用它的密鑰對header和payload進行加密后的結(jié)果
jwt是如何保證數(shù)據(jù)不會被篡改的
服務(wù)器對token解密獲得header、payload和signature,再拿著自己的密鑰對header和payload進行加密,看加密結(jié)果是否和解密出來的signature相等,如果相等說明數(shù)據(jù)沒有被篡改,如果不等說明數(shù)據(jù)已被篡改
由于服務(wù)器的密鑰是不公開的,因此認為簽名不能偽造,也就是說,別人無法通過header、payload來加密得到一個服務(wù)器認可的token
.net webapi 的 demo
為了簡化,這里只做身份認證,也就是說登錄的用戶就有權(quán)訪問所有接口了
在Starup.cs中開啟身份認證服務(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")), }; });
還需要使用身份認證中間件
在需要進行身份認證的接口或控制器上加上特性[Authorize]
還需要實現(xiàn)登錄邏輯,準備一個Get接口用于測試
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) { //驗證用戶名密碼是否正確,錯誤則不進行后續(xù)操作 { //驗證邏輯在此省略 } //驗證成功則繼續(xù)運行后面代碼,來生成token //claims是關(guān)于用戶的一些信息,這部分信息將放在payload中,由于token可以被解密,因此不要把密碼放進去 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生效時間 expires: DateTime.Now.AddMinutes(5), //token有效時間 signingCredentials: credentials); return Ok(new JwtSecurityTokenHandler().WriteToken(token)); } } }
進行測試:
不登錄直接訪問Get會報401
訪問Login會返回一個token
要想成功訪問Get,需要帶上這個token,如何使請求帶上這個token呢?
可以借助postman,
輸入Get接口的路徑
將Authorization類型設(shè)置為Bearer Token,之后將生成的token粘貼到右邊
訪問成功
總結(jié)
到此這篇關(guān)于.net使用jwt進行身份認證的文章就介紹到這了,更多相關(guān).net用jwt身份認證內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
asp.net用url重寫URLReWriter實現(xiàn)任意二級域名
Asp.net 用url重寫(URLReWriter)實現(xiàn)任意二級域名2008-10-10ASP.NET?Core使用EF創(chuàng)建模型(包含屬性、排除屬性、主鍵和生成值)
這篇文章介紹了ASP.NET?Core使用EF創(chuàng)建模型的的方法,文中通過示例代碼介紹的非常詳細。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-04-04Asp.net core實現(xiàn)PushStream視頻流推送
這篇文章介紹了Asp.net core實現(xiàn)PushStream視頻流推送的方法,文中通過示例代碼介紹的非常詳細。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-07-07Coolite Cool Study 3 MVC + Coolite 的實現(xiàn)代碼
啊,開始以為MVC+Coolite結(jié)合的例子沒什么難度,但原來Coolite在MVC中需要特定設(shè)置一下某些屬性才行,費了兩個小時才算大功告成,具體請看下文。還是先把這個例子的效果貼上來再說。2009-05-05ASP.NET WebAPI2復(fù)雜請求跨域設(shè)置的方法介紹
這篇文章主要給大家介紹了關(guān)于ASP.NET WebAPI2復(fù)雜請求跨域設(shè)置的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者使用ASP.NET具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07ASP.NET連接數(shù)據(jù)庫并獲取數(shù)據(jù)方法總結(jié)
這篇文章主要介紹了ASP.NET連接數(shù)據(jù)庫并獲取數(shù)據(jù)方法,結(jié)合實例分析總結(jié)了ASP.NET連接數(shù)據(jù)庫及獲取數(shù)據(jù)的相關(guān)實現(xiàn)技巧,并附帶了web.config配置文件的使用方法與相關(guān)注意事項,需要的朋友可以參考下2015-11-11