首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么我的JWT承载身份验证在令牌显示5分钟后才将令牌识别为过期?

为什么我的JWT承载身份验证在令牌显示5分钟后才将令牌识别为过期?
EN

Stack Overflow用户
提问于 2016-10-19 22:28:53
回答 2查看 6.8K关注 0票数 15

我使用AspNet.Security.OpenIdConnect.Server发出JWT令牌,并将AuthorizationCodeLifetime设置为30秒进行测试。下面是我用来设置选项的代码片段

代码语言:javascript
运行
复制
        options.TokenEndpointPath = "/api/token";
        options.AllowInsecureHttp = true;
        options.AccessTokenHandler = new JwtSecurityTokenHandler();
        options.SigningCredentials.Add(new SigningCredentials(signingKey, SecurityAlgorithms.HmacSha256));
        options.AccessTokenLifetime = TimeSpan.FromSeconds(30);
        options.AuthorizationCodeLifetime = TimeSpan.FromSeconds(30);

返回的令牌包含:

代码语言:javascript
运行
复制
  "expires_in": 30,

反序列化令牌包含以下声明:

代码语言:javascript
运行
复制
 "nbf": 1476915220,
 "exp": 1476915250,
 "iat": 1476915220,

如您所见,exp (过期时间)是iat (发布时间)之后的30秒。然而,令牌在过期5分钟后才会触发401未经授权的设备。如果我们将exp号插入到http://www.epochconverter.com/,那么我们将看到这个值为Wed,2016年10月19日22:14:10格林尼治时间,也就是我当地时间的下午5:14:10。

下面是来自Core库的一些日志输出:

代码语言:javascript
运行
复制
Microsoft.IdentityModel.Tokens.SecurityTokenExpiredException: IDX10223: Lifetime validation failed. The token is expired.
ValidTo: '10/19/2016 22:14:10'
Current time: '10/19/2016 22:19:10'.
   at Microsoft.IdentityModel.Tokens.Validators.ValidateLifetime(Nullable`1 notBefore, Nullable`1 expires, SecurityToken securityToken, TokenValidationParameters validationParameters)
   at System.IdentityModel.Tokens.Jwt.JwtSecurityTokenHandler.ValidateLifetime(Nullable`1 notBefore, Nullable`1 expires, JwtSecurityToken securityToken, TokenValidationParameters validationParameters)
   at System.IdentityModel.Tokens.Jwt.JwtSecurityTokenHandler.ValidateToken(String token, TokenValidationParameters validationParameters, SecurityToken& validatedToken)
   at Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerHandler.<HandleAuthenticateAsync>d__1.MoveNext()
info: Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerMiddleware[7]
      Bearer was not authenticated. Failure message: IDX10223: Lifetime validation failed. The token is expired.
ValidTo: '10/19/2016 22:14:10'
Current time: '10/19/2016 22:19:10'.

当然,这个输出不能证明服务器在22:14:10和22:19:10之间接受令牌,这就是如果我在令牌过期5分钟后碰巧等待,然后尝试验证令牌的话,这就是它应该做的事情,但是您必须相信我的话。我正在用邮递员进行测试,每秒钟点击“发送”键,直到它返回401。

那么,怎么了?有没有5分钟的缓冲区是我不知道的?有趣的是,AccessTokenLifetime的默认值是5分钟,但是令牌肯定反映出我已经将它更改为30秒。到底怎么回事?

我正在使用的相关图书馆:

代码语言:javascript
运行
复制
<package id="AspNet.Security.OpenIdConnect.Extensions" version="1.0.0-beta6-final" targetFramework="net452" />
<package id="AspNet.Security.OpenIdConnect.Server" version="1.0.0-beta6-final" targetFramework="net452" />
<package id="Microsoft.AspNetCore.Authentication.JwtBearer" version="1.0.0" targetFramework="net452" />
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-10-20 01:06:27

那么,怎么了?有没有5分钟的缓冲区是我不知道的?到底怎么回事?

您所称的“缓冲区”实际上是由JWT承载中间件(由Microsoft开发)提供的内置特性,它被称为“时钟倾斜”,旨在减轻网络农场中时钟去同步的影响。

正如您所理解的,默认值设置为5分钟。,但它可以通过JwtBearerOptions.TokenValidationParameters.ClockSkew进行更改。

票数 23
EN

Stack Overflow用户

发布于 2019-11-20 23:24:16

我尝试了ClockSkew = TimeSpan.Zero:

代码语言:javascript
运行
复制
new TokenValidationParameters
    {
                ClockSkew = TimeSpan.Zero
    };

原因是ClockSkew的默认值为5分钟。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40142548

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档