【发布时间】:2017-09-03 00:54:54
【问题描述】:
我有一个 oauth2 资源服务器,它使用 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();
}
}
});
这是应该怎么做的吗?
【问题讨论】:
标签: oauth-2.0 asp.net-core authorization jwt asp.net-core-identity