asp.net core 集成JWT

【什么是JWT】

  JSON Web Token(JWT)是目前最流行的跨域身份验证解决方案。

  JWT的官网地址:https://jwt.io/

  通俗地来讲,JWT是能代表用户身份的令牌,可以使用JWT令牌在api接口中校验用户的身份以确认用户是否有访问api的权限。

  JWT中包含了身份认证必须的参数以及用户自定义的参数,JWT可以使用秘密(使用HMAC算法)或使用RSA或ECDSA的公钥/私钥对进行签名。

【什么时候应该使用JSON Web令牌?】

  1. 授权:这是使用JWT的最常见方案。一旦用户登录,每个后续请求将包括JWT,允许用户访问该令牌允许的路由,服务和资源。Single Sign On是一种现在广泛使用JWT的功能,因为它的开销很小,并且能够在不同的域中轻松使用。

  2. 信息交换:JSON Web令牌是在各方之间安全传输信息的好方法。因为JWT可以签名 - 例如,使用公钥/私钥对 - 您可以确定发件人是他们所说的人。此外,由于使用标头和有效负载计算签名,您还可以验证内容是否未被篡改。

【JWT有什么优势?】

  我们先看我们传统的身份校验方式

  1. 用户向服务器发送用户名和密码。

  2. 服务器验证通过后,在当前对话(session)里面保存相关数据,比如用户角色、登录时间等等。

  3. 服务器向用户返回一个 session_id,写入用户的 Cookie。

  4. 用户随后的每一次请求,都会通过 Cookie,将 session_id 传回服务器。

  5. 服务器收到 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,它具有先前的头和有效负载编码,并使用机密签名。 

  640?wx_fmt=png

  如果您想使用JWT并将这些概念付诸实践,您可以使用jwt.io Debugger来解码,验证和生成JWT。

   640?wx_fmt=png

【JSON Web令牌如何工作?】

  在身份验证中,当用户使用其凭据成功登录时,将返回JSON Web令牌。由于令牌是凭证,因此必须非常小心以防止出现安全问题。一般情况下,您不应该将令牌保留的时间超过要求。

  每当用户想要访问受保护的路由或资源时,用户代理应该使用承载模式发送JWT,通常在Authorization标头中。标题的内容应如下所示:

  Authorization: Bearer <token>

  在某些情况下,这可以是无状态授权机制。服务器的受保护路由将检查Authorization标头中的有效JWT ,如果存在,则允许用户访问受保护资源。如果JWT包含必要的数据,则可以减少查询数据库以进行某些操作的需要,尽管可能并非总是如此。

  如果在标Authorization头中发送令牌,则跨域资源共享(CORS)将不会成为问题,因为它不使用cookie。

  下图显示了如何获取JWT并用于访问API或资源:

  640?wx_fmt=png

  1. 应用程序向授权服务器请求授权

  2. 校验用户身份,校验成功,返回token

  3. 应用程序使用访问令牌访问受保护的资源

【ASP.Net Core 集成JWT】

  前面我们介绍了JWT的原理,下面我们在asp.net core实际项目中集成JWT。

  首先我们新建一个Demo asp.net core 空web项目

  640?wx_fmt=png

  添加数据访问模拟api,ValuesController

  其中api/value1是可以直接访问的,api/value2添加了权限校验特性标签 [Authorize]

640?wx_fmt=png


  添加模拟登陆,生成Token的api,AuthController

  这里模拟一下登陆校验,只验证了用户密码不为空即通过校验,真实环境完善校验用户和密码的逻辑。

640?wx_fmt=png


  Startup添加JWT验证的相关配置

640?wx_fmt=png


  最后把代码里面用到的一些相关常量也粘贴过来,Const.cs

640?wx_fmt=png

  到这里,已经是我们项目的所有代码了。

  如果需要完整的项目代码,Github地址:https://github.com/sevenTiny/Demo.Jwt

【JWT测试】

   我们找一个趁手的工具,比如fiddler,然后把我们的web站点运行起来

  首先调用无权限的接口:http://localhost:5000/api/value1

  640?wx_fmt=png

  640?wx_fmt=png

  正确地返回了数据,那么接下来我们测试JWT的流程

  1. 无权限

  首先我们什么都不加调用接口:http://localhost:5000/api/value2

  640?wx_fmt=png

  640?wx_fmt=png

  返回了状态码401,也就是未经授权:访问由于凭据无效被拒绝。 说明JWT校验生效了,我们的接口收到了保护。

  2.获取Token

  调用模拟登陆授权接口:http://localhost:5000/api/Auth?userName=zhangsan&pwd=123

  这里的用户密码是随便写的,因为我们模拟登陆只是校验了下非空,因此写什么都能通过

  640?wx_fmt=png

  成功得到了响应

  640?wx_fmt=png

  640?wx_fmt=png

  然后我们得到了一个xxx.yyy.zzz 格式的 token 值。我们把token复制出来

  3.在刚才401的接口请求HEADER中添加JWT的参数,把我们的token加上去

  再次调用我们的模拟数据接口,但是这次我们加了一个HEADER:http://localhost:5000/api/value2

  640?wx_fmt=png

  把内容粘出来

User-Agent: Fiddler
Host: localhost:5000
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYmYiOiIxNTYwMzQ1MDIxIiwiZXhwIjoxNTYwMzQ2ODIxLCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA1LzA1L2lkZW50aXR5L2NsYWltcy9uYW1lIjoiemhhbmdzYW4iLCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjUwMDAiLCJhdWQiOiJodHRwOi8vbG9jYWxob3N0OjUwMDAifQ.x7Slk4ho1hZc8sR8_McVTB6VEYLz_v
-5eaHvXtIDS-o

  这里需要注意 Bearer 后面是有一个空格的,然后就是我们上一步获取到的token

  640?wx_fmt=png

  640?wx_fmt=png

  嗯,没有401了,成功返回了数据

  4.JWT的Token过期

  我们且倒一杯开水,坐等30分钟(我们代码中设置的过期时间),然后再次调用数据接口:http://localhost:5000/api/value2

  640?wx_fmt=png

  640?wx_fmt=png

  又变成了401,我们看下详细的返回数据

  640?wx_fmt=png

  这里有标注,错误描述 token过期,说明我们设置的token过期时间生效了

【结束】

  到这里,我们JWT的简介以及asp.net core 集成JWT已经完美完成,当然了这只是一个demo,在实际的应用中需要补充和完善的地方还有很多。

  如果想要完整项目源码的,可以参考地址:https://github.com/sevenTiny/Demo.Jwt

  如果有幸能帮助到你,高抬贵手点个star吧~


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/315530.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

xBIM(eXtensible Building Information Modelling)可扩展的建筑信息模型

一、xBIM 简介BIM&#xff08;Building Information Modelling&#xff09;建筑信息模型&#xff0c;xBIM&#xff08;eXtensible Building Information Modelling&#xff09;可扩展的建筑信息模型。它是一个.NET 开源软件开发BIM工具包&#xff0c;支持BuildingSmart数据模型…

Codeforces Global Round 12 C1 C2. Errich-Tac-Toe 思维构造 好题

传送门 题意&#xff1a; 给了如下规则&#xff0c;上面三个只要出现一个情况就是非平局&#xff0c;现在给你个字符矩阵&#xff0c;让后其中XXX字符有KKK个(hardhardhard版本XXX和OOO一共KKK个)&#xff0c;每次操作可以将XXX变成OOO&#xff0c;OOO变成XXX&#xff0c;用不…

译 | .NET Core 3.0 Preview 6 已发布

原文&#xff1a;Richard Lander翻译&#xff1a;Edi Wang今天&#xff0c;我们宣布 .NET Core 3.0 Preview 6。它的更新包括编译程序集以改进启动、使用链接器和 EventPipe 改进优化应用程序的大小。我们还在 ARM64 上发布了针对 Alpine 的新 Docker 镜像。立即在 Windows、ma…

庆祝.NET Core悄然崛起:免费送50本优秀技术书籍,请笑纳!!

为了庆祝 .NET社区蓬勃发展&#xff0c;今天特地联合几位.NET大佬给大家带来50本高质量技术书籍。.NET Core自开源以来&#xff0c;依托微软强大的科技实力日趋完善&#xff0c;再也不是10年前那种封闭状态。强大的跨平台&#xff0c;强大的IDE&#xff0c;强大的语言特性&…

P2371 [国家集训队]墨墨的等式 同余最短路

传送门 题意&#xff1a; 思路&#xff1a; 一个同于最短路的板子题&#xff0c;初始的时候值为0&#xff0c;所以设dis[0]0dis[0]0dis[0]0&#xff0c;让后选择一个最小的a[i]a[i]a[i]作为basebasebase&#xff0c;跑一遍同余最短路就好啦。跑完dis[i]dis[i]dis[i]表示在模b…

ASP.NET Core WebAPI帮助页--Swagger简单使用1.0

1、什么是Swagger&#xff1f;Swagger是一个规范且完整的框架&#xff0c;提供描述、生产、消费和可视化RESTful API&#xff0c;它是为了解决Web API生成有用文档和帮助页的问题。2、为啥选用swagger?1&#xff09;它具有交互式文档、客户端SDK生成和API可发现性等优点。2&am…

Codeforces Global Round 12 E. Capitalism 差分约束

传送门 题意&#xff1a; 思路&#xff1a; 一开始被题意迷惑了&#xff0c;没看出来差分约束&#xff0c;老菜鸡啦。首先看到ajai1a_ja_i1aj​ai​1可以把aia_iai​分成奇偶&#xff0c;让后这个图就变成一个二分图了。再考虑如何连边&#xff1a; (1) 对于b1b1b1的情况&…

8个月打磨,一份送给程序员的「分布式系统」合集

这里是Z哥的个人公众号每周五早8点 按时送达当然了&#xff0c;也会时不时加个餐&#xff5e;我的第「75」篇原创敬上整理好的文章目录在文末&#xff0c;可直接拉到最后是的&#xff0c;这份礼物最佳受众是程序员。但是&#xff0c;如果你不是程序员&#xff0c;相信这些能使你…

【翻译】无需安装Python,就可以在.NET里调用Python库

原文地址&#xff1a;https://henon.wordpress.com/2019/06/05/using-python-libraries-in-net-without-a-python-installation/pythonnet这个屌爆的项目的出现&#xff0c;使得我们可以用一种新的方式&#xff0c;让C#可以和Python之间进行互操作。但是它的设置和部署可能有点…

Codeforces Round #706 (Div. 2) E. Garden of the Sun 思维构造

传送门 题意&#xff1a; 给你一个nmnmnm的矩阵&#xff0c;其中包含字符′.′.′.′和′X′X′X′&#xff0c;你可以将任何′.′.′.′改成′X′X′X′&#xff0c;现在问你能否通过修改一些′.′.′.′来使′X′X′X′联通且不存在环。保证原本的′X′X′X′没有任何两个相…

Ocelot(六)- 架构图

简介Ocelot是一个用.NET Core实现并且开源的API网关&#xff0c;它功能强大&#xff0c;包括了&#xff1a;路由、请求聚合、服务发现、认证、鉴权、限流熔断、并内置了负载均衡器与Service Fabric、k8s 集成。这些功能只都只需要简单的配置即可完成。架构图Ocelot的目标是使用…

基于Dapper的开源Lambda扩展,且支持分库分表自动生成实体

LnskyDB是基于Dapper的Lambda扩展,支持按时间分库分表,也可以自定义分库分表方法开源地址 https://github.com/liningit/LnskyDB在此非常感谢SkyChenSky其中lambda表达式的解析参考了他的开源项目下面是用ProductSaleByDayEntity作为示例,其中StatisticalDate为分库分表字段,如…

P1297 [国家集训队]单选错位 期望

传送门 题意&#xff1a; 思路&#xff1a; 手推了一下没想到还真的能过。 对于相邻的两个数aia_iai​和ai1a_{i1}ai1​&#xff0c;分两种情况讨论&#xff1a; (1) ai<ai1a_i<a_{i1}ai​<ai1​ 时&#xff0c;答案在[1,ai][1,a_i][1,ai​]的范围内概率为aiai1\fra…

也读《人月神话》:没有银弹的软件工程

一、关于人月神话这本书记得在上大学的时候&#xff0c;就经常听学长和老师讲起《人月神话》&#xff0c;但是却一直没有阅读。记得当时一听到这个书名&#xff0c;还以为是个神马科幻类别的书&#xff0c;结果是个软件工程方面的书籍。这本书是“图灵奖得主、“IBM360系统之父…

P6154 游走 概率dp

传送门 题意&#xff1a; 思路&#xff1a; 给你个DAGDAGDAG&#xff0c;由于每一条路径出现概率相等&#xff0c;那么期望就是总长度路径个数\frac{总长度}{路径个数}路径个数总长度​。设f[i]f[i]f[i]表示到iii这个点的总长度&#xff0c;g[i]g[i]g[i]表示到iii这个点路径的…

[译]如何在C#中调试LINQ查询

LINQ是我在C#中最喜欢的功能之一。它让代码看起来更漂亮美观。我们得到了一个易于编写和理解的简洁函数式语法。好吧&#xff0c;至少我们可以使用LINQ方法的语法风格。LINQ很难进行调试。我们无法知道该查询内部发生了什么。我们可以看到输入和输出&#xff0c;但这就是它的全…

CodeForces - 375D Tree and Queries 树启 + 思维

传送门 题意&#xff1a; 思路&#xff1a; 很明显子树问题会想到树启&#xff0c;让后如何updateupdateupdate呢&#xff1f;一个显然的思路就是维护一个树状数组&#xff0c;查询次数>kj>k_j>kj​的个数。但是这样复杂度是O(nlog2n)O(nlog^2n)O(nlog2n)的&#xf…

WebSocket数据加密——AES与RSA混合加密

前言之前在写“一套简单的web即时通讯”&#xff0c;写到第三版的时候没什么思路&#xff0c;正好微信公众号看到一篇讲API交互加密&#xff0c;于是就自己搞了一套AES与RSA混合加密&#xff0c;无意中产生应用在WebSocket想法&#xff0c;好在思路都差不多&#xff0c;稍微改动…

基于 EntityFramework 生成 Repository 模式代码

借助 WeihanLi.EntityFramework 实现简单的 RepositoryIntro很多时候一些简单的业务都是简单的增删改查&#xff0c;动态生成一些代码完成基本的增删改查&#xff0c;而这些增删改查代码大多类似&#xff0c;只有一些有复杂业务逻辑的可能需要手动去写。于是实现了一个基于 EF …

P3168 [CQOI2015]任务查询系统 主席树 + 差分

传送门 题意&#xff1a; 思路&#xff1a; 题目中(si,ei,pi)(s_i,e_i,p_i)(si​,ei​,pi​)转换成操作即为在[si,ei][s_i,e_i][si​,ei​]区间内加上pip_ipi​的优先级&#xff0c;让后查询的话就是查询第xix_ixi​秒优先级最小的kik_iki​个任务的优先级之和。可知这两个操…