2016-02-11 117 views
2

我有一个Web API服务,允许用户创建新资源,如:POST /api/resource。该服务然后将创建请求放在服务总线上并以HTTP 202 Accepted作出响应。验证服务总线后的过期JWT令牌

后台进程从服务总线中获取消息并调用数据访问层来创建资源。但是,为了执行访问控制,数据访问层需要知道用户是由谁来决定是否允许他/她创建该资源。 我无法将此授权逻辑移入前端Web API,并将可信子系统用于数据访问层。

enter image description here

所以我的解决办法是让对数据访问层的访问令牌,并将其与创建资源有效载荷存储。但是这提出了一个问题。由于该消息可能会在重负载之后进行很多处理,因此令牌在后台进程尝试使用它时可能已过期。此时,无法更新令牌。

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

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

我的方法错了吗?什么是解决这个问题的可行方案?

+0

问:当令牌被添加到服务总线开始时,令牌是否有效(如授权)?或者我误解了你的问题 – Nkosi

+0

@Nkosi当然,该标记在Web服务获取它时有效。但是在工作人员服务使用它时可能会过期。服务总线创建暂时解耦。消息可以在服务总线上处理,或者在一小时后处理。 – MvdD

+0

没错。因此即使令牌过期,与JWT关联的包含用户仍可以在后端提取以进行访问控制。你对JWT有多了解?我问,因为我的想法可能看起来是手动的,你需要知道解码智威汤逊 – Nkosi

回答

2

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

+0

哦,那很酷。我没有意识到这一点。你有链接到更多信息? – MvdD

+2

看看https://github.com/Azure-Samples/active-directory-dotnet-webapi-manual-jwt-validation/blob/master/TodoListService-ManualJwt/Global.asax.cs - 你需要做的如果您要忽略有效性,则将TokenValidationParameters中的ValidateLifetime设置为false。如果您想要有一个自定义验证例程(例如接受不超过30分钟过期的令牌),您可以按照答案中的建议实施LifetimeValidator的处理程序。 – vibronet

+0

完美,这正是我一直在寻找的! – MvdD

0

看看使用刷新标记Auth0 has a good article,用一些示例代码说明背景以及如何使用它们。

+0

刷新标记在这里不起作用。它们只适用于机密客户端(Web应用程序),但这些请求来自浏览器。即使他们来自机密客户端,Web API也无法访问刷新令牌。 – MvdD