JwtSecurityToken返回错误的到期时间

时间:2017-12-08 10:06:42

标签: c# jwt token

我需要检查我的JwtSecurityToken是否已过期。

我正在使用System.IdentityModel.Tokens.Jwt库。

当像这样创建JwtSecurityToken时:

var token = new JwtSecurityToken(
    issuer: token_issuer,
    audience: token_audience,
    claims: claims,
    expires: DateTime.Now.AddMinutes(15),                
    signingCredentials: creds
    );

并检查它的生命周期,我当前时间后<2>小时

我以这种方式检查生命周期(仅用于测试目的):

var lifeTime = new JwtSecurityTokenHandler().ReadToken(token).ValidTo;

我的验证方法:

private static bool ValidateToken(string token)
{
    try
    {
        TokenValidationParameters validationParameters = new TokenValidationParameters
        {
            IssuerSigningKey = new SymmetricSecurityKey(token_salt),
            ValidAudience = token_audience,
            ValidIssuer = token_issuer,
            RequireExpirationTime = true
        };

        var lifeTime = new JwtSecurityTokenHandler().ReadToken(token).ValidTo;

        ClaimsPrincipal principal = new JwtSecurityTokenHandler().ValidateToken(token_last, validationParameters, out SecurityToken validatedToken);

        return true;
    }
    catch(Exception ex)
    {

    }

    return false;
}

任何人都可以解释发生了什么,或者我做错了什么?

编辑(出于解释目的)

测试1

  • 我的设备当前时间: 10:06
  • 使用expiration = DateTime.Now.AddSeconds(5);
  • 令牌的生命周期= 12:06:10 和Kind = UTC
  • 验证没问题。

测试2

  • 我的设备当前时间: 10:16
  • 使用expiration = DateTime.SpecifyKind(DateTime.Now, DateTimeKind.Utc).AddSeconds(5);
  • 令牌的生命周期= 10:16:12 和Kind = UTC
  • 验证失败: Microsoft.IdentityModel.Tokens.SecurityTokenExpiredException: IDX10223: Lifetime validation failed. The token is expired. ValidTo: '12/11/2017 10:16:12' Current time: '12/11/2017 12:18:40'.

测试3

  • 使用expiration = DateTime.UtcNow.AddSeconds(5);
  • 令牌的生命周期= 13:07:10 和Kind = UTC
  • 验证没问题。

为什么验证通过,如果我运行验证时是13:12而令牌的生命周期是13:07?是否有最短的投注时间到期?

2 个答案:

答案 0 :(得分:2)

From the only source of this library got from google search您可以看到时间正在转换为通用时间(UTC)。

DateTime.Now.AddMinutes(15)似乎是个问题 用Datetime.UtcNow.AddMinutes(15)替换它可能会解决它

您当地的时区是UTC + 2:00吗?

答案 1 :(得分:2)

我知道,这是一个老问题,但是TokenValidationParameters类具有名为ClockSkew的属性,默认情况下设置为5分钟。这可能是您的问题,因为这是我的。只需将此属性设置为例如1秒-ClockSkew = TimeSpan.FromSeconds(1)