
引子前面说了用第三方类库生成JWT的故事,给我带来了很大的方便,并且我也承诺要写一篇用常规方法生成JWT
博客园 2023-04-26 21:19:44
(资料图片仅供参考)
前面说了用第三方类库生成JWT的故事,给我带来了很大的方便,并且我也承诺要写一篇用常规方法生成JWT的文章(一般都是用微软官方的类库),因此才有了这篇文章。另外,在前面的文章中,我要纠正一下一些错误JWT的整个结构决定了JWT只能作为临时的授权认证解决方案,如果对用户的机密性要求比较高,必须用有状态控制管理的解决方案,JWT只能作为一般性方案使用,它的应用场合主要是由多个WebAPI构成的多进程多线程多接口这样的微服务架构,是为了解决使用状态管理带来的不便才应用而生,一般JWT必须和HTTPS配合才会具有安全性。这是因为JWT作为一种可被破解的数据,只有TLS加密后,才不会被真正破解。在微软的Indentiy认证框架中(我个人感觉应该叫ASP.NET Core Indentity),MVC和WebAPI虽然使用不同的Nuget包,但本质是一样的……废话不多说了,直接正题开始:有请我们的主角:JwtSecurityTokenHandler(从名字中就知道它和数据库操作有关,JWT中的数据一般都是来自用户数据库,helper一般用来表示资源管理),后面我们会通过它来实现JWT的生成。
实施和前面一样,我们这里主要讲解最常用的非对称算法的JWT,这里采用的算法是RSA,当然你也可以采用其他算法来达到目标。首先需要安装nuget包Microsoft.AspNetCore.Authentication.JwtBearer
,当然,有的文章会让你安装一个System.IdentityModel.Tokens.JWT
的包,这个完全不需要,因为前面的包已经包含后者了,你只要在引用包以后,构建一下工程,在dubug目录里面找到项目生成文件,就会发现这个dll被放进去了。由于ASP.NET Core是以依赖注入为主的,而这个包作为一个Service(服务),需要使用其自身提供的扩展方法来注入ASP.NET Core 的WebApplication的Service对象(IOC容器)中进行集中管理。
builder.Services.AddAuthentication()..AddJwtBearer(jwtOptions =>{ jwtOptions.Authority = "https://jwtserver.test.net"; //jwtOptions.Audience = "jwtresouce"; jwtOptions.TokenValidationParameters = new TokenValidationParameters() { ValidateIssuer = true, ValidateAudience = true, ValidateLifetime = true, ValidateIssuerSigningKey = true, ValidIssuer = builder.Configuration["Jwt:Issuer"],//发行者 ValidAudience = builder.Configuration["Jwt:Audience"], //订阅者 IssuerSigningKey = new RsaSecurityKey(RSA.Create(2048)) //jwt签名算法 };})
JwtSecurityTokenHandler
对象,为后面的工作提供基础再创建一个数组,用来存放用户信息创建SecurityTokenDescriptor
对象,设置JWT的加密算法,有效期等属性调用之前创建的JwtSecurityTokenHandler
对象的CreateToken
方法,创建一个令牌对象,再调用WriteToken
方法,获得到字符串格式的JWT返回结果[HttpPost] public string CreateJwtSecurityToken() { var tokenHandler = new JwtSecurityTokenHandler(); var mookdata = new Dictionary(); mookdata[ClaimTypes.Name] = "John Doe"; mookdata[ClaimTypes.Email] = "johndoe@example.com"; mookdata[ClaimTypes.Role] = "vistor"; var claims = new Claim[mookdata.Count - 1]; foreach (var item in mookdata) { for (int i = 0; i < claims.Length; i++) { claims[i] = new Claim(item.Key, item.Value); } } var tokenDescriptor = new SecurityTokenDescriptor { Subject = new ClaimsIdentity(claims), Expires = DateTime.UtcNow.AddDays(7), SigningCredentials = new SigningCredentials(new RsaSecurityKey(RSA.Create(2048)), SecurityAlgorithms.RsaSha256Signature) }; var token = tokenHandler.CreateToken(tokenDescriptor); var tokenString = tokenHandler.WriteToken(token); return tokenString; }
上述讲到的方法一般都是比较常用的方法(这个好像是来自微软官方文档),先对于上篇文章,它相对比较灵活,不会涉及到x509证书的问题,而且解决方案比较多,容易应用。关于生成JWT,我也是简单的了解和使用,因此层次不少太深,如果读者在其中发现了问题,也欢迎各位提出宝贵的意见,谢谢。关于JWT,我想说这只是WebAPI授权鉴权的开端,不是终点,如果有时间,我会再写一篇结合JWT来授权鉴权的文章,来更好的理解JWT的应用,希望我的文章会给您带来帮助,让我们一起期待吧!
引子前面说了用第三方类库生成JWT的故事,给我带来了很大的方便,并且我也承诺要写一篇用常规方法生成JWT
1、1放心吧,就算我死也会保护你们的,我不会让我的同伴被杀。2、2打破忍者世界规则跟铁律的人,我们都叫他
力量钻石(301071)04月26日在投资者关系平台上答复了投资者关心的问题。
1、首先点击“帮助”,然后点击“检查更新”。2、如果iTunes不是最新版本,将itunes升级到最新版本。3、然
汽车讯4月26日,广汽本田重磅推出拥有全新外观和丰富配置的新飞度,新车共推出含SPORT潮跑Pro和CROSSTAR潮越
ChatGPT,无锡如何与其同行?丨科创周刊(105)
1、可能是服务系统的原因。2、比如它的服务系统接收访问的能力比较差即出现我们玩游戏时常见的爆满。本文到
苏大维格(SZ300331)4月25日晚间发布一季度业绩公告称,2023年第一季度营收约3 93亿元,同比减少1 05%;归
即墨地铁建设何以能始终保持“全线率先”推进?
高能手办团克拉拉怎么搭配阵容?克拉拉是即将登场的新角色,定位为普攻类输出,这名角色对攻速的要求很高。
4月25日消息华峰化学公告,公司控股子公司重庆氨纶建设的非公开发行募投项目30万吨 年差别化氨纶扩建项目部
2022年,人力资源和社会保障部向社会公示18个新职业,这些新职业反映了数字经济发展的需要,数字化解决方案
4月25日,周杰伦久违在个人社交平台分享了两张儿子罗密欧的近照,老父亲还发文写道:“长大了,你就会懂得
交易商品牌 产地交货地最新报价蛋白缓凝剂 蛋白缓凝剂,优等品,25kg 袋济南鑫厚商贸有限公司山东山东省850
1、杨大眼,中国北魏名将。2、世居仇池(今甘肃西和县西南),生卒不详。3、其祖父杨难当,为氐豪,先称蕃于