我已经为owin管道提供了我自己的CookieAuthenticationProvider和
public async override Task ValidateIdentity(CookieValidateIdentityContext context)
在此方法中,我检查用户身份声明中的第三方令牌,以查看它是否已过期或接近过期。如果是这样,我使用它的刷新令牌从第三方获取新的访问令牌,使用新访问生成新身份并刷新令牌,然后登录并替换当前身份。这样,用户始终拥有第三方站点的有效访问令牌。
除了我们有很多ajax请求以及一些信号实时请求进入之外,这非常完美。所以非常普遍的来自用户的2个请求将在不同的线程A& B.线程A首先命中[Authorize]属性,该属性将触发Validate-identity。它看到令牌将会或已经过期并要求刷新。同时,线程B最终做同样的事情。线程A首先完成,现在有一个新的访问令牌和刷新令牌,线程B无法刷新,因为它使用第三方现在认为无效的原始刷新令牌调用刷新,并拒绝任何新的访问令牌,因此用户请求变得未经授权。线程A完成,一切看起来都很好。线程B首先失败了。
我的问题是,这是正确的地方吗?有没有更好的办法?我怎样才能避免这种竞争条件?
答案 0 :(得分:1)
如果要同步这两个请求,则需要中央令牌兑换服务。您甚至可能不会将令牌存储在用户信息/ cookie中,而是将它们直接存储在服务中,并让任何需要令牌的人从服务中请求它们。根据要求,您可以检查续订并确保一次只进行一次续订。