WordPress简单百度站长插件,360免费建站官网,邢台企业做网站价格,wordpress不能上传主题最近沉寂了一段#xff0c;主要是上半年相当于休息和调整了一段时间#xff0c;接下来我将开始陆续学习一些新的技能#xff0c;比如Docker、Jenkins等#xff0c;都会以生活实例从零开始讲解起#xff0c;到时一并和大家分享和交流。接下来几节课的内容将会讲解JWT#… 最近沉寂了一段主要是上半年相当于休息和调整了一段时间接下来我将开始陆续学习一些新的技能比如Docker、Jenkins等都会以生活实例从零开始讲解起到时一并和大家分享和交流。接下来几节课的内容将会讲解JWT关于JWT的原理解析等等大有文章就不再叙述这里我们讲解使用和一些注意的地方。在.NET Core之前对于Web应用程序跟踪用户登录状态最普通的方式则是使用Cookie当用户点击登录后将对其信息进行加密并响应写入到用户浏览器的Cookie里当用户进行请求时服务端将对Cookie进行解密然后创建用户身份整个过程都是那么顺其自然但是这是客户端是基于浏览器的情况如果是客户端是移动app或者桌面应用程序呢关于JWT原理可以参考系列文章https://www.cnblogs.com/RainingNight/p/jwtbearer-authentication-in-asp-net-core.html当然这只是其中一种限制还有其他。如果我们使用Json Web Token简称为JWT而不是使用Cookie此时Token将代表用户同时我们不再依赖浏览器的内置机制来处理Cookie我们仅仅只需要请求一个Token就好。这个时候就涉及到Token认证那么什么是Token认证呢一言以蔽之将令牌(我们有时称为AccessToken或者是Bearer Token)附加到HTTP请求中并对其进行身份认证的过程。Token认证被广泛应用于移动端或SPA。JWT由三部分构成Base64编码的HeaderBase64编码的Payload签名三部分通过点隔开。第一部分以Base64编码的Header主要包括Token的类型和所使用的算法例如第二部分以Base64编码的Payload主要包含的是声明(Claims)例如如下第三部分则是将Key通过对应的加密算法生成签名最终三部分以点隔开比如如下形式到这里此时我们应该知道JWT包含的信息并没有加密比如为了获取Payload我们大可通过比如谷歌控制台中的APiatob对其进行解码如下那如我所说既然JWT包含的信息并没有加密只是进行了Base64编码岂不是非常不安全呢当然不是这样还没说完第三部分就是签名虽然我们对Payload姑且翻译为有效负载未进行加密但是若有蓄意更换Payload此时签名将能充分保证Token无效除非将签名的Key不小心暴露在光天化日之下否则必须是安全的。好了到了这里我们稍稍讲解了下JWT构成接下来我们进入如何在.NET Core中使用JWT。在.NET Core中如何使用JWT那么我们必须得知晓如何创建JWT接下来我们首先创建一个端口号为5000的APi创建JWT然后我们需要安装 System.IdentityModel.Tokens.Jwt 包如下我们直接给出代码来创建Token然后一一对其进行详细解释代码如下如上我们在声明集合中初始化声明时我们使用了两种方式一个是使用ClaimTypes一个是 JwtRegisteredClaimNames 那么这二者有什么区别以及我们到底应该使用哪种方式更好或者说两种方式都使用是否有问题呢针对ClaimTypes则来自命名空间System.Security.Claims 而JwtRegisteredClaimNames则来自命名空间System.IdentityModel.Tokens.Jwt 二者在获取声明方式上是不同的ClaimTypes是沿袭微软提供获取声明的方式比如我们要在控制器Action方法上获取上述ClaimTypes.Name的值此时我们需要F12查看Name的常量定义值是多少如下接下来则是获取声明Name的值如下那么如果我们想要获取声明JwtRegisterClaimNames.Sub的值我们是不是应该如上同样去获取呢我们来试试。此时我们发现为空没有获取到这是为何呢这是因为获取声明的方式默认是走微软定义的一套映射方式如果我们想要走JWT映射声明那么我们需要将默认映射方式给移除掉在对应客户端Startup构造函数中添加如下代码如果用过并熟悉IdentityServer4的童鞋关于这点早已明了因为在IdentityServer4中映射声明比如用户Id即sub是使用的JWT也就是说使用的JwtRegisteredClaimNames此时我们再来获取Sub看看。所以以上对于初始化声明两种方式的探讨并没有用哪个更好因为对于使用ClaimTypes是沿袭以往声明映射的方式如果要出于兼容性考虑可以结合两种声明映射方式来使用。接下来我们来看生成签名代码生成签名是如下代码如上我们给出签名的Key是1234567890123456是不是给定Key的任意长度皆可呢显然不是关于Key的长度至少是16否则会抛出如下错误接下来我们再来看实例化Token的参数即如下代码issuer代表颁发Token的Web应用程序audience是Token的受理者如果是依赖第三方来创建Token这两个参数肯定必须要指定因为第三方本就不受信任如此设置这两个参数后我们可验证这两个参数。要是我们完全不关心这两个参数可直接使用JwtSecurityToken的构造函数来创建Token如下这里需要注意的是Exp和Nbf是基于Unix时间的字符串所以上述通过实例化DateTimeOffset来创建基于Unix的时间。到了这里我们已经清楚的知道如何创建Token接下来我们来使用Token获取数据。我们新建一个端口号为5001的Web应用程序同时安装包【Microsoft.AspNetCore.Authentication.JwtBearer】接下来在Startup中ConfigureServices添加如下代码如上述若Token依赖于第三方而创建此时必然会配置issuer和audience同时在我方也如上必须验证issuer和audience上述我们也验证了签名我们通过设置ValidateLifetime为true说明验证过期时间而并非Token中的值最后设置 ClockSkew 有效期为5分钟。对于设置 ClockSkew 除了如上方式外还可如下设置默认也是5分钟。如上对于认证方案我们使用的是 JwtBearerDefaults.AuthenticationScheme 即Bearer除此之外我们也可以自定义认证方案名称如下最后别忘记添加认证中间件在Configure方法中认证中间件必须放在使用MVC中间件之前如下到了这里我们通过端口为5000的Web Api创建了Token并配置了端口号为5001的Web应用程序使用JWT认证接下来最后一步则是调用端口号为5000的APi获取Token并将Token设置到请求头中Authorization键的值格式如下注意Bearer后面有一个空格我们在页面上放置一个按钮点击获取端口号为5000的Token后接下来请求端口号为5001的应用程序如下本节我们讲解了在.NET Core中使用JWT进行认证以及一点点注意事项比较基础性的东西下一节讲解完在JWT中使用刷新Token开始正式进入Docker系列感谢阅读下节见。