在服务总线后面验证过期的 JWT 令牌

Validating an expired JWT token behind the servicebus

我有一个 Web API 服务,允许用户创建新资源,例如:POST /api/resource。该服务然后将创建请求放在服务总线上并以 HTTP 202 Accepted.

响应

后台进程从服务总线获取消息并调用数据访问层来创建资源。但是,为了实施访问控制,数据访问层需要知道用户是谁,以确定是否允许 he/she 创建该资源。 我无法将此授权逻辑移至前端 Web API 并为数据访问层使用受信任的子系统。

所以我的解决方案是获取数据访问层的访问令牌并将其与资源创建负载一起存储。但这带来了一个问题。由于消息可能会在重负载下处理得更晚,因此当后台进程尝试使用它时,令牌可能已经过期。那个时候也没有办法更新令牌。

所以我想在后端层处理时放宽对令牌有效性的要求。如果令牌有效(受信任的发行者等),但它已过期,我希望验证中间件接受令牌。

但是无法配置 System.IdentityModel.Tokens.Jwt 令牌处理程序来验证过期的令牌。这可以在不编写我自己的令牌验证器的情况下完成吗?

我的做法是不是错了?解决这个问题的可行替代方案是什么?

查看使用刷新令牌Auth0 has a good article 解释了背景及其使用方式,并附有一些示例代码。

JWT 处理程序具有扩展点,允许您保留所有默认验证逻辑并仅覆盖您想要自定义的方面 - 在本例中为过期验证。您可以通过自己的 TokenValidationParameters.LifetimeValidator 实现来实现这一点。