【问题标题】:How to add an additional check to JWT token lifetime validation?如何向 JWT 令牌生命周期验证添加额外检查?
【发布时间】:2019-08-08 22:59:10
【问题描述】:

在我的 Web 应用程序中,我想执行所有默认的生命周期检查(不早于、过期、...),并执行一项额外的检查(生命周期

首先我尝试了这个:

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

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

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

【问题讨论】:

  • 我认为您可以复制 TokenValidationParameters 并传入一个将生命周期验证器设置为 null 的实例。然后它不会递归调用你的函数。
  • 成功了! TokenValidationParameters 类甚至有一个 Clone 方法,这使得这非常容易!随意写下这个作为答案,我会投票并接受它。

标签: authentication asp.net-core jwt bearer-token


【解决方案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,这样它就可以防止递归调用并且不会修改您注册验证器的实际实例。

【讨论】:

  • 嗯,最新的Validators.ValidateLifetime签名返回void;当令牌验证失败时,它会引发异常。所以我们现在必须为程序流捕获异常???
猜你喜欢
  • 2020-11-06
  • 2018-12-23
  • 2017-10-13
  • 2018-12-30
  • 2019-06-05
  • 2019-06-17
  • 2021-06-04
  • 2017-01-03
  • 2018-10-16
相关资源
最近更新 更多