我使用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 Unauthorized。如果我们将exp编号插入http://www.epochconverter.com/,那么我们将看到此评估结果为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分钟然后尝试验证令牌,那就是它本来会做的,但是你必须接受我的话。我在Postman进行测试,然后点击&#34; Send&#34;每秒钟,直到它返回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" />
答案 0 :(得分:16)
那么,该怎么办?是否有内置的5分钟缓冲区,我不知道?发生了什么事?
你叫什么&#34;缓冲&#34;实际上是由JWT承载中间件(由微软开发)提供的内置功能,它被称为&#34;时钟偏差&#34;旨在减轻网络农场中时钟失步的影响。
正如您所知,the default value is set to 5 minutes,但可以通过JwtBearerOptions.TokenValidationParameters.ClockSkew
进行更改。
答案 1 :(得分:0)
我尝试过ClockSkew = TimeSpan.Zero:
new TokenValidationParameters
{
ClockSkew = TimeSpan.Zero
};
其原因是ClockSkew的默认值为5分钟