如何从 jwt 令牌获取“exp”并与当前时间进行比较以检查令牌是否过期

use*_*018 13 c# jwt azure-active-directory bearer-token

我正在使用System.IdentityModel.Tokens.Jwt包和下面的代码解码令牌jwt,但它不会给出 exp值?

 var handler = new JwtSecurityTokenHandler();
 var decodedValue = handler.ReadJwtToken("token");
Run Code Online (Sandbox Code Playgroud)

如何获取exp并与当前DateTime进行比较来计算token是否过期?

在此输入图像描述

更新:

我正在使用Azure.Core.AccessToken我拥有以下属性的地方,

public DateTimeOffset ExpiresOn
    {
        get;
    }
Run Code Online (Sandbox Code Playgroud)

小智 23

我用这个:

using System.IdentityModel.Tokens.Jwt;

public static long GetTokenExpirationTime(string token)
    {
        var handler = new JwtSecurityTokenHandler();
        var jwtSecurityToken = handler.ReadJwtToken(token);
        var tokenExp = jwtSecurityToken.Claims.First(claim => claim.Type.Equals("exp")).Value;
        var ticks= long.Parse(tokenExp);
        return ticks;
    }

public static bool CheckTokenIsValid(string token)
    {
        var tokenTicks = GetTokenExpirationTime(token);
        var tokenDate = DateTimeOffset.FromUnixTimeSeconds(tokenTicks).UtcDateTime;

        var now = DateTime.Now.ToUniversalTime();

        var valid = tokenDate >= now;

        return valid;
    }
Run Code Online (Sandbox Code Playgroud)

  • 为什么不使用 `var now = DateTime.UtcNow;` 而不是 `var now = DateTime.Now.ToUniversalTime();` ? (3认同)

Sin*_*YAS 18

这就是我检查令牌是否有效的方法。

using System.IdentityModel.Tokens.Jwt;

private bool IsValid(string token)
{
    JwtSecurityToken jwtSecurityToken;
    try
    {
        jwtSecurityToken = new JwtSecurityToken(token);
    }
    catch (Exception)
    {
        return false;
    }
    
    return jwtSecurityToken.ValidTo > DateTime.UtcNow;
}
Run Code Online (Sandbox Code Playgroud)