如何向 JWT 令牌生命周期验证添加额外的检查?

Rob*_*ner 3 authentication jwt bearer-token asp.net-core

在我的 Web 应用程序中,我想要执行所有默认的生命周期检查(不在之前、过期等),并执行一项附加检查(生命周期 < 2 小时)。

首先我尝试了这个:

services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddJwtBearer(JwtBearerDefaults.AuthenticationScheme, o => {
        o.TokenValidationParameters = new TokenValidationParameters()
        {
            ValidateLifetime = true,
            LifetimeValidator = (DateTime? notBefore, DateTime? expires, SecurityToken securityToken, TokenValidationParameters validationParameters) => {
                // --> my custom check <--
            }
        };
    });
Run Code Online (Sandbox Code Playgroud)

这将执行我的自定义检查,但它将跳过默认实现,因此不再执行所有常规检查(不在之前、到期时……)。

然后我从处理程序中调用默认实现,如下所示:

services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddJwtBearer(JwtBearerDefaults.AuthenticationScheme, o => {
        o.TokenValidationParameters = new TokenValidationParameters()
        {
            ValidateLifetime = true,
            LifetimeValidator = (DateTime? notBefore, DateTime? expires, SecurityToken securityToken, TokenValidationParameters validationParameters) => {
                    Microsoft.IdentityModel.Tokens.Validators.ValidateLifetime(notBefore, expires, securityToken, validationParameters);
                // --> my custom check <--
            }
        };
    });
Run Code Online (Sandbox Code Playgroud)

但这将递归调用我的处理程序并最终使我的应用程序崩溃。

那么...延长默认生命周期验证器的正确方法是什么?

juu*_*nas 9

你可以这样做:

services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddJwtBearer(JwtBearerDefaults.AuthenticationScheme, o => {
        o.TokenValidationParameters = new TokenValidationParameters()
        {
            ValidateLifetime = true,
            LifetimeValidator = (DateTime? notBefore, DateTime? expires, SecurityToken securityToken, TokenValidationParameters validationParameters) => {
                var clonedParameters = validationParameters.Clone();
                clonedParameters.LifetimeValidator = null;
                bool valid = Microsoft.IdentityModel.Tokens.Validators.ValidateLifetime(notBefore, expires, securityToken, clonedParameters);
                // --> my custom check <--
            }
        };
    });
Run Code Online (Sandbox Code Playgroud)

因此,我们复制并将TokenValidationParameters生命周期验证器引用设置为 null,这样它可以防止递归调用,并且不会修改您注册验证器的实际实例。

  • 嗯,最新的 Validators.ValidateLifetime 签名返回 void;当令牌验证失败时,它会抛出异常。所以我们现在必须捕获程序流程的异常??? (4认同)