【问题标题】:Jwt token in dotnet with no Exp and default propsdotnet 中的 Jwt 令牌,没有 Exp 和默认道具
【发布时间】:2021-06-15 20:52:54
【问题描述】:

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

我已经使用我需要的声明生成了我的令牌,但我需要令牌永不过期(我知道这不是一个好习惯,但我只是在执行命令),而且我还需要删除令牌的默认道具,例如nbf 和 iat。

我正在使用 lib Microsoft.AspNetCore.Authentication.JwtBearer 我在文档中没有找到太多,所以我什至不知道是否有可能

【问题讨论】:

    标签: c# .net-core jwt bearer-token


    【解决方案1】:

    您是否尝试在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 令牌生成功能的会员系统)。

    【讨论】:

    • 我控制了发行人,我猜你的代码可以不检查过期日期,但我被要求从令牌中删除它。也许是因为如果我在 exp 上设置了一个遥远的日期,一个恶意的人可以得到一个令牌并自动知道他有终身访问权限。但是谢谢你的帮助,我想不检查 exp 日期就足够了。
    • 所以您无法控制令牌消费者?问题是,如果消费者期望令牌中有一个有效的到期日期,那么这几乎就是故事的结局。令牌只需要拥有该数据。 :/ 但是,如果您确实可以控制消费者,那么我认为可以将其配置为仅在存在时检查 exp。
    • 至于在这种特殊情况下使已发行的令牌无效,我首先想到的是更改发行者和消费者用于创建/验证签名的加密密钥。编辑:忘了给你加标签,不确定你是否在没有它的情况下收到通知:) @LincolnTeixeira
    • @LincolnTeixeira 我在答案中添加了一些东西。但是请随时让我知道什么对您最有帮助,以及您的具体情况是什么,我可以进一步编辑它。 :)
    • 感谢您的帮助,我想这对我有用。在发行方移除 exp、iat 和 nbf 的部分是我真正需要的
    猜你喜欢
    • 2018-12-19
    • 2017-11-24
    • 2017-11-01
    • 1970-01-01
    • 2020-09-25
    • 2020-10-24
    • 2022-12-04
    • 2023-02-09
    相关资源
    最近更新 更多