如何避免 ICookieAuthenticationProvider.ValidateIdentity 中的令牌刷新并发问题?
How can I avoid this token refresh concurrency issue in ICookieAuthenticationProvider.ValidateIdentity?
我已经通过
为 owin 管道提供了我自己的 CookieAuthenticationProvider
public async override Task ValidateIdentity(CookieValidateIdentityContext context)
在这种方法中,我检查用户身份声明中的第 3 方令牌,看它是否已过期或即将过期。如果是这样,我使用它的刷新令牌从第 3 方获取新的访问令牌,使用新的访问令牌和刷新令牌生成新身份,然后登录并替换当前身份。这样,用户始终拥有对第 3 方站点的有效访问令牌。
这非常完美,除了我们有很多 ajax 请求以及一些实时信号传入请求。因此,通常来自用户的 2 个请求将在不同的线程 A 和 B 上处理。线程 A 首先点击 [Authorize] 属性,这会触发 Validate-identity。它看到令牌将要或已经过期并要求刷新。与此同时,线程 B 最终做同样的事情。线程 A 首先完成,现在有一个新的访问令牌和刷新令牌,线程 B 无法刷新,因为它使用原始刷新令牌调用刷新,第三者现在认为该令牌无效并拒绝任何新的访问令牌,因此用户请求变得未经授权.线程 A 完成,一切看起来都很好。线程 B 失败了,无论它首先要做什么。
我的问题是,这是执行此操作的正确位置吗?有没有更好的办法?我怎样才能避免这种竞争情况?
如果你想同步这两个请求,那么你需要一个中央令牌兑换服务。您甚至可以不将令牌存储在用户 info/cookie 中,而是将它们直接存储在服务中,让需要令牌的人从服务中请求它们。根据要求,您可以检查续订并确保一次只进行一次续订。
我已经通过
为 owin 管道提供了我自己的 CookieAuthenticationProviderpublic async override Task ValidateIdentity(CookieValidateIdentityContext context)
在这种方法中,我检查用户身份声明中的第 3 方令牌,看它是否已过期或即将过期。如果是这样,我使用它的刷新令牌从第 3 方获取新的访问令牌,使用新的访问令牌和刷新令牌生成新身份,然后登录并替换当前身份。这样,用户始终拥有对第 3 方站点的有效访问令牌。
这非常完美,除了我们有很多 ajax 请求以及一些实时信号传入请求。因此,通常来自用户的 2 个请求将在不同的线程 A 和 B 上处理。线程 A 首先点击 [Authorize] 属性,这会触发 Validate-identity。它看到令牌将要或已经过期并要求刷新。与此同时,线程 B 最终做同样的事情。线程 A 首先完成,现在有一个新的访问令牌和刷新令牌,线程 B 无法刷新,因为它使用原始刷新令牌调用刷新,第三者现在认为该令牌无效并拒绝任何新的访问令牌,因此用户请求变得未经授权.线程 A 完成,一切看起来都很好。线程 B 失败了,无论它首先要做什么。
我的问题是,这是执行此操作的正确位置吗?有没有更好的办法?我怎样才能避免这种竞争情况?
如果你想同步这两个请求,那么你需要一个中央令牌兑换服务。您甚至可以不将令牌存储在用户 info/cookie 中,而是将它们直接存储在服务中,让需要令牌的人从服务中请求它们。根据要求,您可以检查续订并确保一次只进行一次续订。