代码之家  ›  专栏  ›  技术社区  ›  Robert Hegner

如何向JWT令牌生存期验证添加附加检查?

  •  0
  • Robert Hegner  · 技术社区  · 6 年前

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

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

    所以…正确的方法是什么 延伸 默认的生存期验证器?

    0 回复  |  直到 6 年前
        1
  •  1
  •   juunas    6 年前

    您可以这样做:

    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并将lifetime validator引用设置为空,这样可以防止递归调用,并且不会修改注册了validator的实际实例。