Rob*_*ner 3 authentication jwt bearer-token asp.net-core
在我的 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 <--
}
};
});
Run Code Online (Sandbox Code Playgroud)
这将执行我的自定义检查,但它将跳过默认实现,因此不再执行所有常规检查(不在之前、到期时……)。
然后我从处理程序中调用默认实现,如下所示:
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 <--
}
};
});
Run Code Online (Sandbox Code Playgroud)
但这将递归调用我的处理程序并最终使我的应用程序崩溃。
那么...延长默认生命周期验证器的正确方法是什么?
你可以这样做:
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 <--
}
};
});
Run Code Online (Sandbox Code Playgroud)
因此,我们复制并将TokenValidationParameters生命周期验证器引用设置为 null,这样它可以防止递归调用,并且不会修改您注册验证器的实际实例。
| 归档时间: |
|
| 查看次数: |
6006 次 |
| 最近记录: |