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