authentication - 如何为 JWT token 生命周期验证添加额外检查?

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

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

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

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

最佳答案

你可以这样做:

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

关于authentication - 如何为 JWT token 生命周期验证添加额外检查?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55223675/

相关文章:

c# - 如何在 ASP.NET Core 中设置请求的内容类型?

angularjs - 400 Bad Request if Authorization Bearer token 使用

node.js - 在 GraphQL 服务器中实现访问控制的好的模式是什么?

node.js - req.session.passport 和 req.user 空白,并且 req.isAuthenticated 在使用 passport-facebook 首次成功登录后返回 false

asp.net-core - 从 ASP.NET CORE 中的 appsettings.json 文件读取 Entity Framework 6 连接字符串

c# - JSON 网络 token - 如何识别用户?

python - 使用 Azure Active Directory B2C 中的签名验证 ID token

javascript - 如何获取 Facebook cookie? (javascript)

perl - 如何堆叠Plack身份验证处理程序?

asp.net-core - 托管具有多个版本 dotnet 运行时(如 Django 的 virtualenv)的 ASP.NET Core?