最新要闻

广告

手机

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

家电

焦点速讯:接口安全性问题02——jwt身份验证与授权

来源:博客园

简介

JWT定义了一种紧凑的、自包含的方式,用于作为JSON对象在各方之间安全地传输信息。该信息可以被验证和信任,因为它是数字签名的。


【资料图】

工作流程

1、用户使用账号、密码登录应用,登录的请求发送到认证服务器。

2、认证服务器进行用户验证,然后创建JWT字符串返回给客户端。

3、客户端请求接口时,在请求头带上JWT。应用服务器验证JWT合法性,如果合法则继续调用应用接口返回结果。

数据结构

JWT由3部分组成:标头(Header)、有效载荷(Payload)和签名(Signature)。在传输的时候,会将JWT的3部分分别进行Base64编码后用.进行连接形成最终传输的字符串JWT由3部分组成:标头(Header)、有效载荷(Payload)和签名(Signature)。在传输的时候,会将JWT的3部分分别进行Base64编码后用.进行连接形成最终传输的字符串JWT一般是这样一个字符串,分为三个部分,以"."隔开:

token认证的优势

相⽐于 Session 认证的⽅式来说,使⽤ jwt 进⾏⾝份认证主要有下⾯优势

1.⽆状态

2.有效避免了CSRF 攻击

3.适合移动端应⽤

4.单点登录友好

NETCore使用JWT

示例 .NET API 具有以下端点/路由,以演示使用 JWT 进行身份验证、刷新和撤销令牌以及访问安全路由:

  • /users/authenticate- 接受正文中包含用户名和密码的 POST 请求的公共路由。成功时,将返回一个包含基本用户详细信息的 JWT 访问令牌,以及一个包含刷新令牌的 HTTP Only cookie。
  • /users/refresh-token- 接受包含带有刷新令牌的 cookie 的 POST 请求的公共路由。成功后,将返回一个包含基本用户详细信息的新 JWT 访问令牌,以及一个包含新刷新令牌的 HTTP Only cookie(有关解释,请参阅下面的刷新令牌轮换)。
  • /users/revoke-token- 接受在请求正文或 cookie 中包含刷新令牌的 POST 请求的安全路由,如果两者都存在,则优先考虑请求正文。成功后令牌将被撤销并且不能再用于生成新的 JWT 访问令牌。
  • /users- 接受 GET 请求并返回应用程序中所有用户列表的安全路由。
  • /users/{id}- 接受 GET 请求并返回具有指定 ID 的用户详细信息的安全路由。
  • /users/{id}/refresh-tokens- 接受 GET 请求并返回具有指定 ID 的用户的所有刷新令牌(活动和已撤销)列表的安全路由。

刷新令牌轮换

每次使用刷新令牌生成新的 JWT 令牌(通过路由/users/refresh-token)时,刷新令牌将被撤销并由新的刷新令牌替换。这种技术被称为刷新令牌轮换,并通过缩短刷新令牌的生命周期来提高安全性,这使得被破坏的令牌不太可能有效(或长期有效)。轮换刷新令牌时,新令牌将保存在ReplacedByToken已撤销令牌的字段中,以在数据库中创建审计跟踪。

已撤销和过期的刷新令牌记录在数据库中保留的天数在appsettings.jsonRefreshTokenTTL文件的属性中设置。默认值为 2 天,之后旧的非活动令牌将被用户服务在和方法中删除。Authenticate()RefreshToken()

撤销令牌重用检测

如果尝试使用已撤销的刷新令牌生成新的 JWT 令牌,API 会将此视为具有被盗(已撤销)刷新令牌的潜在恶意用户,或者在其令牌被撤销后试图访问系统的有效用户由具有被盗(活动)刷新令牌的恶意用户。在任何一种情况下,API 都会撤销所有后代令牌,因为令牌及其后代可能是在可能已被破坏的同一设备上创建的。撤销的原因被记录下来,"Attempted reuse of revoked ancestor token"以便用户可以在数据库中或通过/users/{id}/refresh-tokens路由看到它。

用于测试的 EF Core InMemory 数据库

为了使 api 代码尽可能简单,它被配置为使用 EF Core InMemory 数据库提供程序,它允许 Entity Framework Core 创建并连接到内存数据库,而不必安装真正的数据库服务器。启动时会在Program.cs文件中自动创建测试用户。

可以轻松切换数据库提供程序以连接真实数据库,例如 SQL Server、Oracle、MySql 等,有关在开发中使用 SQLite 和在生产中使用 SQL Server 的示例 api,请参阅 .NET 6.0 - 用户注册和登录教程以及示例API.

GitHub 上的代码

该教程项目可在 GitHub 上找到,网址为https://github.com/Hedgehogcat/2023

参考:https://jasonwatmore.com/net-6-jwt-authentication-with-refresh-tokens-tutorial-with-example-api

关键词: 详细信息 访问令牌