没有Exp和默认道具的dotnet中的Jwt令牌



我正在使用.Net core 3.1制作一个身份api,我注册该api并让我的用户登录,然后我需要传递一个JWT令牌以供前端使用。

我已经用我需要的声明生成了我的代币,但我需要代币永远不会过期(我知道这不是一个好的做法,但我只是听从命令(,而且我还需要删除代币的默认道具,如nbf和iat。

我正在使用库Microsoft.AspNetCore.Authentication.JwtBearer我在文档中没有发现太多,所以我甚至不知道这是否可能是

您尝试过在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代币生成功能的会员系统(。

最新更新