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