我需要帮助来了解时钟偏差的工作原理。我们定义时钟偏差来处理两方之间的时间变化。但是,我的困惑是:
那么,为什么我们需要时钟偏差?谁能给我举个例子来说明它是如何工作的以及在哪些情况下它会导致问题或好处?
让我们考虑一个短期访问令牌。当我向服务器发出请求时,服务器将检查我的令牌是否已过期。它是如何检查的?嗯,它知道令牌何时创建,并且知道现在是什么时间。大多数访问令牌会在一小时后过期,但这实际上取决于它在身份验证服务器中的设置方式。因此,如果令牌是在一个多小时前创建的,那么它就会过期,并且用户会收到通知。这就是为什么我们尝试确保服务器与 NTP 同步。
我们首先考虑一下什么是时钟偏差。如果我们有两个身份验证服务器怎么办?你怎么知道他们会有相同的时间?如果他们实际上晚了几分钟怎么办?一台服务器将返回令牌已过期,而另一台服务器则不会。如果您是一家小公司,这可能并不重要。
现在考虑一下您是否是一家在世界各地拥有服务器的大型搜索引擎公司。假设现在是 2016 年秋天,夏令时开始了。现在,您的一些服务器在一个时间运行,而其他服务器在另一个时间运行。也许,只是也许,某个国家决定在开始夏令时时做出改变,然后,突然,一堆代币无缘无故地失效了。 _免责声明 我不为上述搜索引擎公司工作。我刚刚目睹了这一切的发生,这是我对所发生事情的理论。
为什么我们需要时钟偏差?
你不需要它,但如果你有两个身份验证服务器,你就可以拥有它。所以你可能应该处理它。 https://softwareengineering.stackexchange.com/a/245182/160992
好吧,你的机器上没有发生时钟偏差。默认情况下,时钟偏差设置为 5 分钟。这就是 JWT 没有在期望的时间过期的原因。
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
};
});