时钟偏差和令牌

new*_*per 12 oauth access-token oauth-2.0 identityserver4

我需要帮助来了解时钟偏差的工作原理。我们定义时钟偏差来处理两方之间的时间变化。但是,我的困惑是:

  1. 我们在令牌本身中有所有信息,例如令牌创建时间和到期时间
  2. 令牌可以被验证
  3. 令牌是在服务器上创建的

那么,为什么我们需要时钟偏差呢?谁能给我一个例子来说明它是如何工作的以及它在哪些情况下会导致问题或好处?

小智 8

好吧,你的机器上没有发生时钟偏差。默认情况下,时钟偏差设置为 5 分钟。这就是 JWT 没有在期望的时间过期的原因。


raj*_*est 7

Microsoft JWT 验证中间件存在时钟偏差。默认设置为5分钟,不能小于(300秒/5分钟)

有一个名为 ClockSkew 的令牌验证参数,它获取或设置验证时间时要应用的时钟偏差。ClockSkew 的默认值为 5 分钟。这意味着如果您尚未设置,您的令牌在最多 5 分钟内仍然有效。如果您想在确切的时间使您的令牌过期;您需要将 ClockSkew 设置为零,如下所示,

 services.AddAuthentication("Bearer").AddJwtBearer("Bearer", options =>
        {
            options.Authority = "https://localhost:44347";
            options.TokenValidationParameters = new TokenValidationParameters
            {
                ValidateAudience = false,
                ValidateLifetime = true,
                ClockSkew = TimeSpan.Zero
            };
        });
Run Code Online (Sandbox Code Playgroud)

  • 您说“不能少于 5 分钟”,但随后您将 `ClockSkew` 设置为 `TimeSpan.Zero`。你能详细说明一下吗? (7认同)

DaI*_*mTo 6

让我们考虑一个短期访问令牌。当我向服务器发出请求时,服务器将检查我的令牌是否已过期。它如何检查它是否知道令牌何时创建以及现在是什么时间。大多数访问令牌会在一个小时后过期,但这实际上取决于它在身份验证服务器中的设置方式。因此,如果令牌是在一个多小时前创建的,则它已过期,并且会通知用户。这就是我们尝试确保服务器与NTP同步的原因。

让我们首先考虑什么是时钟偏差。如果我们有两个身份验证服务器怎么办?你怎么知道他们会有相同的时间?如果他们实际上差了几分钟怎么办。一台服务器将返回令牌已过期,而另一台则不会。如果您是一家小公司,这可能无关紧要。

现在考虑一下您是否是一家在全球拥有服务器的大型搜索引擎公司。假设它是 2016 年的秋天,夏令时开始了。现在您有一些服务器在一个时间运行,而其他服务器在另一个时间运行。也许只是某个国家/地区决定在开始夏令时时进行更改,并且大量代币无缘无故失效。免责声明我不为上述搜索引擎公司工作。我只是看着这件事发生,这是我对发生的事情的理论。

为什么我们需要时钟偏差。

您不需要它,但如果您有两个身份验证服务器,则可以拥有它。所以你可能应该处理它。 https://softwareengineering.stackexchange.com/a/245182/160992

  • 不错的答案,但时钟偏差也发生在同一台机器上。我有 IdentityServer4 和使用 IdentityServer 的桌面应用程序,所以它们都在同一台机器上。IS4 在本地主机中。令牌没有按照设置过期。添加时钟偏差设置后它得到了修复!你能就这种情况提出建议吗? (3认同)