如何用System.IdentityModel.Tokens.Jwt包提取token过期时间
How to extract the token expiration time with the System.IdentityModel.Tokens.Jwt package
我想在我的 .NET Core 项目中使用 JSON 网络令牌进行身份验证。这就是我向其中添加 System.IdentityModel.Tokens.Jwt
包的原因。
我熟悉用于验证和解码令牌的 JavaScript equivalent jsonwebtoken
package which provides a verify
函数。
大多数时候我只需要提取有效负载来获取用户和其他信息,但在某些情况下我还需要知道令牌何时过期(例如,通过将令牌存储到数据库来使令牌无效,以及到期后将其删除)。
我从这个示例代码开始
public object ValidateAndDecodeToken(string token)
{
SymmetricSecurityKey symmetricSecurityKey = GenerateSymmetricSecurityKey("db3OIsj+BXE9NZDy0t8W3TcNekrF+2d/1sFnWG4HnV8TZY30iTOdtVWJG8abWvB1GlOgJuQZdcF2Luqm/hccMw=="); // From config
try
{
JwtSecurityTokenHandler tokenHandler = new JwtSecurityTokenHandler();
TokenValidationParameters tokenValidationParameters = new TokenValidationParameters()
{
ValidateIssuerSigningKey = true,
IssuerSigningKey = symmetricSecurityKey
};
tokenHandler.ValidateToken(token, tokenValidationParameters, out SecurityToken validatedToken);
DateTime tokenExpiresAt = DateTime.Now; // TODO
JwtSecurityToken jwtSecurityToken = tokenHandler.ReadJwtToken(encodedToken);
Dictionary<string, string> tokenPayload = jwtSecurityToken.Claims.ToDictionary(claim => claim.Type, claim => claim.Value);
return new { token, tokenExpiresAt, tokenPayload };
}
catch
{
throw;
}
}
private SymmetricSecurityKey GenerateSymmetricSecurityKey(string base64Secret)
{
byte[] symmetricKey = Convert.FromBase64String(base64Secret);
return new SymmetricSecurityKey(symmetricKey);
}
如您所见,我正在尝试提取令牌过期时间和有效负载。我认为有效载荷应该可以正常工作,但我如何提取过期信息?
从您的示例代码中,您应该能够获得到期时间:
tokenHandler.ValidateToken(token, tokenValidationParameters, out SecurityToken validatedToken);
var tokenExpiresAt = validatedToken.ValidTo;
我想在我的 .NET Core 项目中使用 JSON 网络令牌进行身份验证。这就是我向其中添加 System.IdentityModel.Tokens.Jwt
包的原因。
我熟悉用于验证和解码令牌的 JavaScript equivalent jsonwebtoken
package which provides a verify
函数。
大多数时候我只需要提取有效负载来获取用户和其他信息,但在某些情况下我还需要知道令牌何时过期(例如,通过将令牌存储到数据库来使令牌无效,以及到期后将其删除)。
我从这个示例代码开始
public object ValidateAndDecodeToken(string token)
{
SymmetricSecurityKey symmetricSecurityKey = GenerateSymmetricSecurityKey("db3OIsj+BXE9NZDy0t8W3TcNekrF+2d/1sFnWG4HnV8TZY30iTOdtVWJG8abWvB1GlOgJuQZdcF2Luqm/hccMw=="); // From config
try
{
JwtSecurityTokenHandler tokenHandler = new JwtSecurityTokenHandler();
TokenValidationParameters tokenValidationParameters = new TokenValidationParameters()
{
ValidateIssuerSigningKey = true,
IssuerSigningKey = symmetricSecurityKey
};
tokenHandler.ValidateToken(token, tokenValidationParameters, out SecurityToken validatedToken);
DateTime tokenExpiresAt = DateTime.Now; // TODO
JwtSecurityToken jwtSecurityToken = tokenHandler.ReadJwtToken(encodedToken);
Dictionary<string, string> tokenPayload = jwtSecurityToken.Claims.ToDictionary(claim => claim.Type, claim => claim.Value);
return new { token, tokenExpiresAt, tokenPayload };
}
catch
{
throw;
}
}
private SymmetricSecurityKey GenerateSymmetricSecurityKey(string base64Secret)
{
byte[] symmetricKey = Convert.FromBase64String(base64Secret);
return new SymmetricSecurityKey(symmetricKey);
}
如您所见,我正在尝试提取令牌过期时间和有效负载。我认为有效载荷应该可以正常工作,但我如何提取过期信息?
从您的示例代码中,您应该能够获得到期时间:
tokenHandler.ValidateToken(token, tokenValidationParameters, out SecurityToken validatedToken);
var tokenExpiresAt = validatedToken.ValidTo;