为了账号安全,请及时绑定邮箱和手机立即绑定

停止刷新令牌的比赛条件?

停止刷新令牌的比赛条件?

潇湘沐 2021-05-04 12:20:16
我有一个reactjs网站和asp.net核心后端,并且刷新令牌有问题。当有人登录到我的网站时,他们将获得访问令牌和刷新令牌(相当标准)。现在,我设置了一个比访问令牌的时间短的计时器。当他们有多个选项卡打开时,所有这些都很好用。问题在于它们都共享本地存储(需要自动登录,因此不能使用会话存储)设想2个标签页一个接一个地打开。在访问令牌死亡之前2分钟设置2个计时器。第一次触发时会先发送刷新令牌到服务器,然后带回新的刷新/访问令牌。在服务器上,发送的刷新令牌将被删除。第2个计时器会在第一个计时器后不久(第一个计时器正在工作时)触发,但现在很有可能已删除刷新令牌,从而使该请求无效。如何停止这种比赛状态?var foundRefreshToken = dbContext.Tokens.FirstOrDefault(x => x.Value == refreshToken);if (foundRefreshToken == null){    return null;}var newRefreshToken = CreateRefreshToken(foundRefreshToken.ClientId, foundEmployee.Id);dbContext.Tokens.Remove(foundRefreshToken);dbContext.Tokens.Add(newRefreshToken);dbContext.SaveChanges();private Token CreateRefreshToken(string clientId, string userId)    {        return new Token()        {            ClientId = clientId,            EmployeeId = userId,            Value = GenerateRefreshToken(),            CreatedDate = DateTime.UtcNow        };    }// high level js  refreshTimer;  setRefreshTimer(intervals) {    this.clearRefreshTimer();    this.refreshTimer = setInterval(() => {      this.refreshAuthentication();    }, intervals);  }我能想到的仅有两件事是不要删除刷新令牌(但这会导致自动登录出现问题)或者我在本地存储中有一个“锁定”第一个选项卡以执行刷新的标记,而其他标记则等待查看是否执行该操作(猜测需要另一个计时器)。如果不是,则尝试下一个。还有其他想法吗?
查看完整描述

2 回答

?
素胚勾勒不出你

TA贡献1827条经验 获得超9个赞

当您创建令牌和刷新令牌时,两者都应具有一个到期日期,例如:


return new Token()

        {

            ClientId = clientId,

            EmployeeId = userId,

            Value = GenerateRefreshToken(),

            CreatedDate = DateTime.UtcNow,

            ExpirationDate = <you decide>

        };

在每个请求上,您都应该通过比较日期来检查令牌是否过期。如果已过期,则可以使用保持用户身份验证。最终,您甚至无法使刷新令牌过期,因为它必须由您的应用程序安全地存储。


刷新令牌和短期令牌背后的想法是,如果令牌被泄露,黑客只需要说10分钟,他就需要refresh_token来生成一个新令牌。


查看完整回答
反对 回复 2021-05-27
?
慕姐8265434

TA贡献1813条经验 获得超2个赞

最佳实践要求刷新令牌只能使用一次,并且每次使用新令牌时都应该发行一个。再次尝试使用旧的令牌应视为被盗令牌-该用户的所有未使用令牌均应失效,并且任何新的访问尝试均需要完整登录。

当两个会话共享一个公共的刷新令牌时(例如,当在浏览器中打开两个选项卡并且该令牌存储在仅HTTP的cookie中时),就会发生竞争状态。当出现两个会话使用相同的刷新令牌同时尝试刷新的情况时,服务器的第一个会话将获得有效的新令牌,但是第二个会话发现其令牌现在无效并被注销。

如OP所述,可以使用诸如忙碌标志之类的机制在前端解决此问题,以便必须先完成第一次刷新,然后才能进行第二次刷新。

在后端,您可以使用一种机制,允许刷新令牌在完全失效或删除之前的很短时间内(仅几秒钟)被重用。


查看完整回答
反对 回复 2021-05-27
  • 2 回答
  • 0 关注
  • 146 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信