网站开发单位,成都十大营销策划公司,河北seo网络推广,服务器维护是怎么维护的【什么是JWT】JSON Web Token#xff08;JWT#xff09;是目前最流行的跨域身份验证解决方案。JWT的官网地址#xff1a;https://jwt.io/通俗地来讲#xff0c;JWT是能代表用户身份的令牌#xff0c;可以使用JWT令牌在api接口中校验用户的身份以确认用户是否有访问api的权… 【什么是JWT】 JSON Web TokenJWT是目前最流行的跨域身份验证解决方案。 JWT的官网地址https://jwt.io/ 通俗地来讲JWT是能代表用户身份的令牌可以使用JWT令牌在api接口中校验用户的身份以确认用户是否有访问api的权限。 JWT中包含了身份认证必须的参数以及用户自定义的参数JWT可以使用秘密使用HMAC算法或使用RSA或ECDSA的公钥/私钥对进行签名。【什么时候应该使用JSON Web令牌】授权这是使用JWT的最常见方案。一旦用户登录每个后续请求将包括JWT允许用户访问该令牌允许的路由服务和资源。Single Sign On是一种现在广泛使用JWT的功能因为它的开销很小并且能够在不同的域中轻松使用。信息交换JSON Web令牌是在各方之间安全传输信息的好方法。因为JWT可以签名 - 例如使用公钥/私钥对 - 您可以确定发件人是他们所说的人。此外由于使用标头和有效负载计算签名您还可以验证内容是否未被篡改。【JWT有什么优势】 我们先看我们传统的身份校验方式用户向服务器发送用户名和密码。服务器验证通过后在当前对话session里面保存相关数据比如用户角色、登录时间等等。服务器向用户返回一个 session_id写入用户的 Cookie。用户随后的每一次请求都会通过 Cookie将 session_id 传回服务器。服务器收到 session_id找到前期保存的数据由此得知用户的身份。 这种模式的问题在于扩展性scaling不好。单机当然没有问题如果是服务器集群或者是跨域的服务导向架构就要求 session 数据共享每台服务器都能够读取 session。如果session存储的节点挂了那么整个服务都会瘫痪体验相当不好风险也很高。 相比之下JWT的实现方式是将用户信息存储在客户端服务端不进行保存。每次请求都把令牌带上以校验用户登录状态这样服务就变成了无状态的服务器集群也很好扩展。【JWT令牌结构】 在紧凑的形式中JSON Web Tokens由dot.分隔的三个部分组成它们是Header 头Payload 有效载荷Signature 签名 因此JWT通常如下所示 xxxxx.yyyyy.zzzzz 1.Header 头 标头通常由两部分组成令牌的类型即JWT以及正在使用的签名算法例如HMAC SHA256或RSA。 例如 然后这个JSON被编码为Base64Url形成JWT的第一部分。 2.Payload 有效载荷 Payload 部分也是一个 JSON 对象用来存放实际需要传递的数据。JWT 规定了7个官方字段供选用。iss (issuer)签发人exp (expiration time)过期时间sub (subject)主题aud (audience)受众nbf (Not Before)生效时间iat (Issued At)签发时间jti (JWT ID)编号 除了官方字段你还可以在这个部分定义私有字段下面就是一个例子。例如{sub: 1234567890,name: John Doe,admin: true} 注意JWT 默认是不加密的任何人都可以读到所以不要把秘密信息放在这个部分。这个 JSON 对象也要使用 Base64URL 算法转成字符串。 3.Signature 签名 Signature 部分是对前两部分的签名防止数据篡改。 首先需要指定一个密钥secret。这个密钥只有服务器才知道不能泄露给用户。然后使用 Header 里面指定的签名算法默认是 HMAC SHA256按照下面的公式产生签名。HMACSHA256( base64UrlEncode(header) . base64UrlEncode(payload), secret) 签名用于验证消息在此过程中未被更改并且在使用私钥签名的令牌的情况下它还可以验证JWT的发件人是否是它所声称的人。 把他们三个全部放在一起 输出是三个由点分隔的Base64-URL字符串可以在HTML和HTTP环境中轻松传递而与基于XML的标准如SAML相比更加紧凑。 下面显示了一个JWT它具有先前的头和有效负载编码并使用机密签名。 如果您想使用JWT并将这些概念付诸实践您可以使用jwt.io Debugger来解码验证和生成JWT。 【JSON Web令牌如何工作】 在身份验证中当用户使用其凭据成功登录时将返回JSON Web令牌。由于令牌是凭证因此必须非常小心以防止出现安全问题。一般情况下您不应该将令牌保留的时间超过要求。 每当用户想要访问受保护的路由或资源时用户代理应该使用承载模式发送JWT通常在Authorization标头中。标题的内容应如下所示 Authorization: Bearer token 在某些情况下这可以是无状态授权机制。服务器的受保护路由将检查Authorization标头中的有效JWT 如果存在则允许用户访问受保护资源。如果JWT包含必要的数据则可以减少查询数据库以进行某些操作的需要尽管可能并非总是如此。 如果在标Authorization头中发送令牌则跨域资源共享CORS将不会成为问题因为它不使用cookie。 下图显示了如何获取JWT并用于访问API或资源 应用程序向授权服务器请求授权校验用户身份校验成功返回token应用程序使用访问令牌访问受保护的资源【ASP.Net Core 集成JWT】 前面我们介绍了JWT的原理下面我们在asp.net core实际项目中集成JWT。 首先我们新建一个Demo asp.net core 空web项目 添加数据访问模拟apiValuesController 其中api/value1是可以直接访问的api/value2添加了权限校验特性标签 [Authorize] 添加模拟登陆生成Token的apiAuthController 这里模拟一下登陆校验只验证了用户密码不为空即通过校验真实环境完善校验用户和密码的逻辑。 Startup添加JWT验证的相关配置 最后把代码里面用到的一些相关常量也粘贴过来Const.cs 到这里已经是我们项目的所有代码了。 如果需要完整的项目代码Github地址https://github.com/sevenTiny/Demo.Jwt【JWT测试】 我们找一个趁手的工具比如fiddler然后把我们的web站点运行起来 首先调用无权限的接口http://localhost:5000/api/value1 正确地返回了数据那么接下来我们测试JWT的流程 1. 无权限 首先我们什么都不加调用接口http://localhost:5000/api/value2 返回了状态码401也就是未经授权:访问由于凭据无效被拒绝。 说明JWT校验生效了我们的接口收到了保护。 2.获取Token 调用模拟登陆授权接口http://localhost:5000/api/Auth?userNamezhangsanpwd123 这里的用户密码是随便写的因为我们模拟登陆只是校验了下非空因此写什么都能通过 成功得到了响应 然后我们得到了一个xxx.yyy.zzz 格式的 token 值。我们把token复制出来 3.在刚才401的接口请求HEADER中添加JWT的参数把我们的token加上去 再次调用我们的模拟数据接口但是这次我们加了一个HEADERhttp://localhost:5000/api/value2 把内容粘出来User-Agent: FiddlerHost: localhost:5000Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYmYiOiIxNTYwMzQ1MDIxIiwiZXhwIjoxNTYwMzQ2ODIxLCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA1LzA1L2lkZW50aXR5L2NsYWltcy9uYW1lIjoiemhhbmdzYW4iLCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjUwMDAiLCJhdWQiOiJodHRwOi8vbG9jYWxob3N0OjUwMDAifQ.x7Slk4ho1hZc8sR8_McVTB6VEYLz_v-5eaHvXtIDS-o 这里需要注意 Bearer 后面是有一个空格的然后就是我们上一步获取到的token 嗯没有401了成功返回了数据 4.JWT的Token过期 我们且倒一杯开水坐等30分钟我们代码中设置的过期时间然后再次调用数据接口http://localhost:5000/api/value2 又变成了401我们看下详细的返回数据 这里有标注错误描述 token过期说明我们设置的token过期时间生效了【结束】 到这里我们JWT的简介以及asp.net core 集成JWT已经完美完成当然了这只是一个demo在实际的应用中需要补充和完善的地方还有很多。 如果想要完整项目源码的可以参考地址https://github.com/sevenTiny/Demo.Jwt 如果有幸能帮助到你高抬贵手点个star吧~