JwtSecurityToken 返回错误的过期时间

per*_*zzo 5 c# token jwt

我需要检查我的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
    );
Run Code Online (Sandbox Code Playgroud)

并检查它的生命周期,我比当前时间了2 小时。

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

var lifeTime = new JwtSecurityTokenHandler().ReadToken(token).ValidTo;
Run Code Online (Sandbox Code Playgroud)

我的验证方法:

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;
}
Run Code Online (Sandbox Code Playgroud)

谁能解释发生了什么或者我做错了什么?


编辑(出于解释目的)

测试 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,那么为什么验证通过?到期时是否有最短下注时间?

Mic*_*lPr 10

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


Par*_*rma 9

从谷歌搜索得到的这个库的唯一来源你可以看到时间被转换为世界时 (UTC)。

DateTime.Now.AddMinutes(15)似乎是问题所在。
更换它Datetime.UtcNow.AddMinutes(15)可能会修复它

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