在我的 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/