我有一个oauth2资源服务器,它使用JwtBearerMiddleware
来验证访问令牌。现在我不希望安全印记发生变化时访问令牌无效。因为它看起来像这个中间件不会自己验证安全印章。jwtBearerMiddleware中的安全戳验证程序
我发现SecurityStampValidator
类似乎只验证cookie身份验证。
我在哪里以及如何从我的json Web令牌验证安全印章?
我目前的方式做到这一点的是当我注册JwtBearerMiddleware
以注册OnTokenValidated
事件的事件处理程序。在这个事件处理程序中,我简单地查询数据库中的安全声明并将其与令牌中的声明进行比较。当安全戳不相同时,我只需将上下文的Ticket
和SecurityToken
设置为null
,并跳到下一个中间件,如果需要身份验证,它将最终抛出401 http状态码。
app.UseJwtBearerAuthentication(new JwtBearerOptions
{
...
Events = new JwtBearerEvents
{
OnTokenValidated = async (ctx) =>
{
var securityStampClaim = ctx.Ticket.Principal.Claims.FirstOrDefault(claim => claim.Type == "AspNet.Identity.SecurityStamp");
var subjectClaim = ctx.Ticket.Principal.Claims.FirstOrDefault(claim => claim.Type == OpenIdConnectConstants.Claims.Subject);
if (securityStampClaim == null || subjectClaim == null)
return;
var user = await userStore.FindByIdAsync(subjectClaim.Value, ctx.HttpContext.RequestAborted);
if (user?.SecurityStamp == securityStampClaim.Value)
return;
ctx.SecurityToken = null;
ctx.Ticket = null;
ctx.SkipToNextMiddleware();
}
}
});
这是应该怎么做?
为什么asp身份证在理赔原则中存储安全戳呢? 并且用每个验证邮票的请求来访问数据库效率不高吗? –