.Net Core官方JWT授权验证的全过程
什么是jwt?
json web令牌(jwt)是一个开放标准(rfc 7519),它定义了一种紧凑且自包含的方式,用于在各方之间安全地传输信息作为json对象。由于此信息是经过数字签名的,因此可以被验证和信任。可以使用秘密(使用hmac算法)或使用rsa或ecdsa的公钥/私钥对对jwt进行签名。
尽管可以对jwt进行加密以提供双方之间的保密性,但我们将重点关注已签名的令牌。签名的令牌可以验证其中包含的声明的完整性,而加密的令牌则将这些声明隐藏在其他方的面前。当使用公钥/私钥对对令牌进行签名时,签名还证明只有持有私钥的一方才是对其进行签名的一方。由于缺乏安全性,所以不能把如密码等敏感信息放在令牌中。
什么时候应该使用jwt?
以下是json web令牌有用的一些情况:
- 授权:这是使用jwt的最常见方案。一旦用户登录,每个后续请求将包括jwt,从而允许用户访问该令牌允许的路由,服务和资源。单一登录是当今广泛使用jwt的一项功能,因为它的开销很小并且可以在不同的域中轻松使用。
- 信息交换:json web令牌是在各方之间安全传输信息的好方法。因为可以对jwt进行签名(例如,使用公钥/私钥对),所以您可以确定发件人是他们所说的人。此外,由于签名是使用标头和有效负载计算的,因此您还可以验证内容是否未被篡改。
jwt结构是什么?
json web令牌以紧凑的形式由三部分组成,这些部分由点(.)分隔,分别是:
- 标头
- 有效载荷
- 签名
因此,jwt通常如下所示。
xxxxx.yyyyy.zzzzz
标头:通常由两部分组成,令牌类型和使用的签名算法。
有效载荷:有三种说明类型,预定义声明、公共声明和私有声明。声明名称仅是三个字符,因为jwt是紧凑的
- 预定义声明:包括iss(发出者), exp(到期时间), sub(主题), aud(受众)等,是推荐的但是不是强制的可以没有。
- 公共声明:公共声明,这个部分可以随便定义,但是要注意和 iana json web token 冲突。
- 私有声明:这个部分是共享被认定信息中自定义部分。
签名:要创建签名部分,您必须获取编码的标头,编码的有效负载,机密,标头中指定的算法,并对其进行签名。
例如,如果要使用hmac sha256算法,则将通过以下方式创建签名:
签名用于验证消息在此过程中没有更改,并且对于使用私钥进行签名的令牌,它还可以验证jwt的发送者是它所说的真实身份。
组合在一起如下为输出是三个由点分隔的base64-url字符串:
如何使用jwt
每当用户想要访问受保护的路由或资源时,用户代理都应发送jwt,通常使用承载模式在authorization标头中发送jwt 。标头的内容应如下所示:
在某些情况下,这可以是无状态授权机制。服务器的受保护路由将在authorization标头中检查有效的jwt ,如果存在,则将允许用户访问受保护的资源。如果jwt包含必要的数据,则可以减少查询数据库中某些操作的需求,尽管这种情况并非总是如此。
如果令牌是在authorization标头中发送的,则跨域资源共享(cors)不会成为问题,因为它不使用cookie。
下图显示了如何获取jwt并将其用于访问api或资源:
- 应用程序或客户端向授权服务器请求授权。这是通过不同的授权流程之一执行的。例如,典型的符合openid connect的web应用程序将/oauth/authorize使用授权代码流通过端点。
- 授予授权后,授权服务器会将访问令牌返回给应用程序。
- 该应用程序使用访问令牌来访问受保护的资源(例如api)。
请注意,使用签名的令牌,令牌中包含的所有信息都会暴露给用户或其他方,即使他们无法更改它。这意味着您不应将机密信息放入令牌中。
.net core的jwt验证授权
我们直接新建一个.net core webapi的项目,我这里版本是3.1的
1. 先使用nuget安装:microsoft.aspnetcore.authentication.jwtbearer。注意版本和.net core版本的兼容。net5的支持5.0.0+的版本,否则就用对应可以用的低版本吧。
2. 在appsettings.json配置文件中写好我们的 jwt 的配置参数如下:
3. 在startup.cs的configureservices方法中添加授权认证如下:
在configure方法中添加 app.useauthentication() 和 app.useauthorization() 注意位置需要放置的位置:
4. 生成jwt令牌,在默认生成的控制器 weatherforecastcontroller 中添加如下生成令牌的方法:
5. 使用jwt控制接口的访问,我们在一个接口上添加一个特性 [authorize(roles ="admin")],表示需要有admin这个角色的jwt令牌才能访问,没有roles参数的话表示只要是可用的令牌就可以访问,多个role角色可以叠加多个特性:
6.测试,然后我们用postman就可以测试了,可以看到非常成功有数据。
进阶
认证的时候可以添加事件,如下面的认证失败事件、接收参数事件可以获取url上的参数作为令牌而不是通过http的请求头的authorization。
总结
到此这篇关于.net core官方jwt授权验证的文章就介绍到这了,更多相关.net core官方jwt授权验证内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
下一篇: 银杏的果实是白果吗?这么多年你都误会了吧
推荐阅读
-
.Net Core官方JWT授权验证的全过程
-
ASP.NET Core 3.0 一个 jwt 的轻量角色/用户、单个API控制的授权认证库
-
【.NET Core项目实战-统一认证平台】第十二章 授权篇-深入理解JWT生成及验证流程
-
ASP.NET Core使用JWT认证授权的方法
-
【从零开始搭建自己的.NET Core Api框架】(四)实战!带你半个小时实现接口的JWT授权验证
-
asp.net core3.1cookie和jwt混合认证授权实现多种身份验证方案
-
ASP.NET Core 使用 JWT 自定义角色/策略授权需要实现的接口
-
浅谈ASP.NET Core 中jwt授权认证的流程原理
-
ASP.NET Core使用JWT自定义角色并实现策略授权需要的接口
-
.Net Core官方JWT授权验证的全过程