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

问题描述 投票:0回答:1

在我的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 <--
            }
        };
    });

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

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

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 <--
            }
        };
    });

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

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

authentication asp.net-core jwt bearer-token
1个回答
1
投票

你可以这样做:

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 <--
            }
        };
    });

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

© www.soinside.com 2019 - 2024. All rights reserved.