【发布时间】: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