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

Jwt token in dotnet with no Exp and default props

我正在使用 .Net core 3.1 创建一个身份 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 日期。如果以后需要使令牌无效,我想你可以做的一件事是将发行者和消费者使用的加密密钥更改为 create/validate 签名。

在发行方删除 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 令牌生成功能的会员系统)。