我使用AspNet.Security.OpenIdConnect.Server发出JWT令牌,并将AuthorizationCodeLifetime设置为30秒进行测试。下面是我用来设置选项的代码片段
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);返回的令牌包含:
"expires_in": 30,反序列化令牌包含以下声明:
"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库的一些日志输出:
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秒。到底怎么回事?
我正在使用的相关图书馆:
<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" />发布于 2016-10-20 01:06:27
那么,怎么了?有没有5分钟的缓冲区是我不知道的?到底怎么回事?
您所称的“缓冲区”实际上是由JWT承载中间件(由Microsoft开发)提供的内置特性,它被称为“时钟倾斜”,旨在减轻网络农场中时钟去同步的影响。
正如您所理解的,默认值设置为5分钟。,但它可以通过JwtBearerOptions.TokenValidationParameters.ClockSkew进行更改。
发布于 2019-11-20 23:24:16
我尝试了ClockSkew = TimeSpan.Zero:
new TokenValidationParameters
{
ClockSkew = TimeSpan.Zero
};原因是ClockSkew的默认值为5分钟。
https://stackoverflow.com/questions/40142548
复制相似问题