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

我有一个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);

  }

我能想到的仅有两件事是不要删除刷新令牌(但这会导致自动登录出现问题)


或者我在本地存储中有一个“锁定”第一个选项卡以执行刷新的标记,而其他标记则等待查看是否执行该操作(猜测需要另一个计时器)。如果不是,则尝试下一个。


还有其他想法吗?


潇湘沐
浏览 147回答 2
2回答

素胚勾勒不出你

当您创建令牌和刷新令牌时,两者都应具有一个到期日期,例如:return new Token()&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ClientId = clientId,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; EmployeeId = userId,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Value = GenerateRefreshToken(),&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; CreatedDate = DateTime.UtcNow,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ExpirationDate = <you decide>&nbsp; &nbsp; &nbsp; &nbsp; };在每个请求上,您都应该通过比较日期来检查令牌是否过期。如果已过期,则可以使用保持用户身份验证。最终,您甚至无法使刷新令牌过期,因为它必须由您的应用程序安全地存储。刷新令牌和短期令牌背后的想法是,如果令牌被泄露,黑客只需要说10分钟,他就需要refresh_token来生成一个新令牌。

慕姐8265434

最佳实践要求刷新令牌只能使用一次,并且每次使用新令牌时都应该发行一个。再次尝试使用旧的令牌应视为被盗令牌-该用户的所有未使用令牌均应失效,并且任何新的访问尝试均需要完整登录。当两个会话共享一个公共的刷新令牌时(例如,当在浏览器中打开两个选项卡并且该令牌存储在仅HTTP的cookie中时),就会发生竞争状态。当出现两个会话使用相同的刷新令牌同时尝试刷新的情况时,服务器的第一个会话将获得有效的新令牌,但是第二个会话发现其令牌现在无效并被注销。如OP所述,可以使用诸如忙碌标志之类的机制在前端解决此问题,以便必须先完成第一次刷新,然后才能进行第二次刷新。在后端,您可以使用一种机制,允许刷新令牌在完全失效或删除之前的很短时间内(仅几秒钟)被重用。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript