ASP.NET中 Swagger添加JWT驗(yàn)證的流程
JWT
1、解析
1)客戶端向授權(quán)服務(wù)系統(tǒng)發(fā)起請求,申請獲取“令牌”。
2)授權(quán)服務(wù)根據(jù)用戶身份,生成一張專屬“令牌”,并將該“令牌”以JWT規(guī)范返回給客戶端
3)客戶端將獲取到的“令牌”放到http請求的headers中后,向主服務(wù)系統(tǒng)發(fā)起請求。主服務(wù)系統(tǒng)收到請求后會從headers中獲取“令牌”,并從“令牌”中解析出該用戶的身份權(quán)限,然后做出相應(yīng)的處理(同意或拒絕返回資源)
2、配置JWT
1、添加NuGet包Microsoft.AspNetCore.Authentication.JwtBearer
2、在appsettings.json
中添加JWT配置節(jié)點(diǎn)
"JWT": { "SecKey": "Jamin1127!#@$%@%^^&*(~Czmjklneafguvioszb%yuv&*6WVDf5dw#5dfw6f5w6faW%FW^f5wa65f^AWf56", //密鑰 "Issuer": "Jamin", //發(fā)行者 "ExpireSeconds": 7200 //過期時(shí)間 }
3、在Program類里進(jìn)行服務(wù)注冊
#region JWT服務(wù) // 注冊JWT服務(wù) builder.Services.AddSingleton(new JwtHelper(builder.Configuration)); builder.Services.AddAuthentication( JwtBearerDefaults.AuthenticationScheme).AddJwtBearer(options => { options.TokenValidationParameters = new TokenValidationParameters() { ValidateIssuer = true, //是否驗(yàn)證Issuer ValidIssuer = builder.Configuration["Jwt:Issuer"], //發(fā)行人Issuer ValidateAudience = false, //是否驗(yàn)證Audience ValidateIssuerSigningKey = true, //是否驗(yàn)證SecurityKey IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(builder.Configuration["Jwt:SecKey"])), //SecurityKey ValidateLifetime = true, //是否驗(yàn)證失效時(shí)間 ClockSkew = TimeSpan.FromSeconds(30), //過期時(shí)間容錯(cuò)值,解決服務(wù)器端時(shí)間不同步問題(秒) RequireExpirationTime = true, }; } ); #endregion //swagger里添加JWT授權(quán) builder.Services.AddSwaggerGen(c=> { c.SwaggerDoc("v1", new OpenApiInfo { Title = "Web API", Version = "v1" }); //開啟注釋 var xmlFile = $"{Assembly.GetEntryAssembly().GetName().Name}.xml"; var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile); c.IncludeXmlComments(xmlPath, true); // 配置 JWT Bearer 授權(quán) c.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme { Description = "JWT Authorization header using the Bearer scheme", Name = "Authorization", In = ParameterLocation.Header, Type = SecuritySchemeType.Http, Scheme = "bearer" }); var securityScheme = new OpenApiSecurityScheme { Reference = new OpenApiReference { Type = ReferenceType.SecurityScheme, Id = "Bearer" } }; var securityRequirement = new OpenApiSecurityRequirement { { securityScheme, new string[] { } } }; c.AddSecurityRequirement(securityRequirement); }); //啟用驗(yàn)證中間件 app.UseAuthentication(); app.UseAuthorization();
4、創(chuàng)建JWT類進(jìn)行Token配置
using Microsoft.IdentityModel.Tokens; using System.Diagnostics; using System.IdentityModel.Tokens.Jwt; using System.Security.Claims; using System.Text; namespace Blog.core.Common.Auth { /// <summary> /// 授權(quán)JWT類 /// </summary> public class JwtHelper { private readonly IConfiguration _configuration; /// <summary> /// Token配置 /// </summary> /// <param name="configuration"></param> public JwtHelper(IConfiguration configuration) { _configuration = configuration; } /// <summary> /// 創(chuàng)建Token 這里面可以保存自己想要的信息 /// </summary> /// <param name="username"></param> /// <param name="mobile"></param> /// <returns></returns> public string CreateToken(string username, string mobile) { try { // 1. 定義需要使用到的Claims var claims = new[] { new Claim("username", username), new Claim("mobile", mobile), /* 可以保存自己想要信息,傳參進(jìn)來即可 new Claim("sex", "sex"), new Claim("limit", "limit"), new Claim("head_url", "xxxxx") */ }; // 2. 從 appsettings.json 中讀取SecretKey var secretKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration["Jwt:SecKey"])); // 3. 選擇加密算法 var algorithm = SecurityAlgorithms.HmacSha256; // 4. 生成Credentials var signingCredentials = new SigningCredentials(secretKey, algorithm); // 5. 根據(jù)以上,生成token var jwtSecurityToken = new JwtSecurityToken( _configuration["Jwt:Issuer"], //Issuer _configuration["Jwt:ExpireSeconds"], //ExpireSeconds claims, //Claims, DateTime.Now, //notBefore DateTime.Now.AddSeconds(30), //expires signingCredentials //Credentials ); // 6. 將token變?yōu)閟tring var token = new JwtSecurityTokenHandler().WriteToken(jwtSecurityToken); return token; } catch (Exception) { throw; } } /// <summary> /// 獲取信息 /// </summary> /// <param name="jwt"></param> /// <returns></returns> public static string ReaderToken(string jwt) { var str = string.Empty; try { //獲取Token的三種方式 //第一種直接用JwtSecurityTokenHandler提供的read方法 var jwtHander = new JwtSecurityTokenHandler(); JwtSecurityToken jwtSecurityToken = jwtHander.ReadJwtToken(jwt); str = jwtSecurityToken.ToString(); } catch (Exception ex) { Debug.WriteLine(ex.Message); } return str; } /// <summary> /// 解密jwt /// </summary> /// <param name="jwt"></param> /// <returns></returns> public string JwtDecrypt(string jwt) { StringBuilder sb = new StringBuilder(); try { JwtSecurityTokenHandler tokenHandler = new(); TokenValidationParameters valParam = new(); var securityKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration["Jwt:SecKey"])); valParam.IssuerSigningKey = securityKey; valParam.ValidateIssuer = false; valParam.ValidateAudience = false; //解密 ClaimsPrincipal claimsPrincipal = tokenHandler.ValidateToken(jwt, valParam, out SecurityToken secToken); foreach (var claim in claimsPrincipal.Claims) { sb.Append($"{claim.Type}={claim.Value}"); } } catch (Exception ex) { Debug.WriteLine(ex.Message); } return sb.ToString(); } } }
5、創(chuàng)建用戶實(shí)體,進(jìn)行用戶密碼的接收
using System.ComponentModel.DataAnnotations; namespace Blog.core.Models { public class UserInfo { /// <summary> /// 其中 [Required] 表示非空判斷,其他自己研究百度 /// </summary> [Required] public string UserName { get; set; } [Required] public string Password { get; set; } [Required] public string PhoneNumber { get; set; } } }
6、創(chuàng)建控制器,進(jìn)行JWT的APi調(diào)用
using Blog.core.Common.Auth; using Blog.core.Models; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; namespace Blog.core.Controllers { [Route("[controller]/[action]")] [ApiController] public class UserController : ControllerBase { private readonly JwtHelper _jwt; /// <summary> /// 初始化 /// </summary> /// <param name="jwtHelper"></param> public UserController(JwtHelper jwtHelper) { _jwt = jwtHelper; } /// <summary> /// 獲取Token /// </summary> /// <returns></returns> [HttpPost] public IActionResult GetToken(UserInfo user) { //參數(shù)驗(yàn)證等等.... if (string.IsNullOrEmpty(user.UserName)) { return Ok("參數(shù)異常!"); } //這里可以連接mysql數(shù)據(jù)庫做賬號密碼驗(yàn)證 //這里可以做Redis緩存驗(yàn)證等等 //這里獲取Token,當(dāng)然,這里也可以選擇傳結(jié)構(gòu)體過去 var token = _jwt.CreateToken(user.UserName, user.PhoneNumber); //解密后的Token var PWToken = _jwt.JwtDecrypt( token); return Ok(token+"解密后:"+PWToken); } /// <summary> /// 獲取自己的詳細(xì)信息,其中 [Authorize] 就表示要帶Token才行 /// </summary> /// <returns></returns> [HttpPost] [Authorize] public IActionResult GetSelfInfo() { //執(zhí)行到這里,就表示已經(jīng)驗(yàn)證授權(quán)通過了 /* * 這里返回個(gè)人信息有兩種方式 * 第一種:從Header中的Token信息反向解析出用戶賬號,再從數(shù)據(jù)庫中查找返回 * 第二種:從Header中的Token信息反向解析出用戶賬號信息直接返回,當(dāng)然,在前面創(chuàng)建 Token時(shí),要保存進(jìn)使用到的Claims中。 */ return Ok("授權(quán)通過了!"); } } }
注:獲取Token后在Swagger上輸入token的value就可以進(jìn)行接口的調(diào)用了
到此這篇關(guān)于ASP.NET中 Swagger添加JWT驗(yàn)證的流程的文章就介紹到這了,更多相關(guān)Swagger添加JWT驗(yàn)證內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
asp.net mvc 從數(shù)據(jù)庫中讀取圖片的實(shí)現(xiàn)代碼
今天搞了一天的MVC,在顯示圖片的時(shí)候老是出現(xiàn)問題,從網(wǎng)上搜索了好久,才找到解決方法。2010-05-05WPF實(shí)現(xiàn)進(jìn)度條實(shí)時(shí)更新效果
這篇文章主要為大家詳細(xì)介紹了WPF實(shí)現(xiàn)進(jìn)度條實(shí)時(shí)更新效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-12-12RadioButtonList綁定圖片及泛型Dictionary應(yīng)用
讀取站點(diǎn)某一目錄的圖片,需要掌握LINQ與泛型Dictionary<TKey,TValue>的使用,本文將介紹RadioButtonList綁定圖片的實(shí)現(xiàn),感興趣的朋友可以了解下,或許對你有所幫助2013-02-02如何在ASP.NET Core中使用Session的示例代碼
這篇文章主要介紹了如何在ASP.NET Core中使用Session的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01DataSet、DataTable、DataRow區(qū)別詳解
這篇文章主要介紹了DataSet、DataTable、DataRow區(qū)別詳解,需要的朋友可以參考下2014-02-02.NET Core中的HttpClientFactory類用法詳解
本文詳細(xì)講解了.NET Core中的HttpClientFactory類的用法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-03-03.NET使用YARP通過編碼方式配置域名轉(zhuǎn)發(fā)實(shí)現(xiàn)反向代理
這篇文章介紹了.NET使用YARP通過編碼方式配置域名轉(zhuǎn)發(fā)實(shí)現(xiàn)反向代理的方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-09-09利用ASP.NET MVC+EasyUI+SqlServer搭建企業(yè)開發(fā)框架
本文主要介紹使用asp.net mvc4、sqlserver、jquery2.0和easyui1.4.5搭建企業(yè)級開發(fā)框架的過程,希望能夠幫到大家。2016-04-04