您是否尝试在TokenValidationParameters 中将ValidateLifetime 设置为false?这将允许任何到期日期。
您可以做的另一件事是将RequireExpirationTime 设置为false,这意味着exp 不需要出现在令牌中。
因此,如果您想将其配置为允许令牌不包含过期时间,但在存在 exp 属性时仍验证过期时间,您可以这样做:
.AddJwtBearer(options =>
{
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateLifetime = true,
RequireExpirationTime = false,
};
});
另外,如果需要,您可以在同一位置设置自定义生命周期验证器:
.AddJwtBearer(options =>
{
options.TokenValidationParameters = new TokenValidationParameters
{
// ... Other settings
LifetimeValidator = (notBefore, expiration, token, parameters) =>
{
// Decide if expiration is valid. Don't forget about clock skew.
}
};
});
虽然尚不清楚您是否可以控制令牌发行者或令牌消费者,或两者兼而有之。以上所有解决方案都假设您可以控制令牌消费者。
如果您只能控制发行人,那就有点困难了。我想到的是设置一个非常遥远的exp 日期。如果以后需要使令牌无效,我想您可以做的一件事是更改发行者和消费者用来创建/验证签名的加密密钥。
在发行方移除 exp、iat 和 nbf
至于从令牌中删除属性,您可以将它们留在令牌生成中。假设您正在手动生成令牌,您需要对其进行配置,例如像这样:
var tokenOptions = new JwtSecurityToken(
issuer: jwtIssuer,
audience: jwtAudience,
claims: new List<Claim>() {
new Claim(JwtRegisteredClaimNames.Sub, userName),
},
// 'expires' not set
signingCredentials: new SigningCredentials(new SymmetricSecurityKey(Convert.FromBase64String(someKey)), SecurityAlgorithms.HmacSha256)
);
以这种方式生成它不会包含 exp、iat 或 nbf(本地确认)。
当然,如果您碰巧通过例如Identity Server,这是一个不同的故事,但后来你忘了提到这一点(你提到了 Identity,它是一个没有内置 JWT 令牌生成功能的会员系统)。