Oauth 2.0 jwtbearermiddware中的安全戳验证器

Oauth 2.0 jwtbearermiddware中的安全戳验证器,oauth-2.0,asp.net-core,authorization,jwt,asp.net-core-identity,Oauth 2.0,Asp.net Core,Authorization,Jwt,Asp.net Core Identity,我有一个oauth2资源服务器,它使用jwtbearermiddware验证访问令牌。现在,如果安全标记已更改,我不认为访问令牌无效。因为看起来这个中间件本身并没有验证安全标记 我找到了SecurityStampValidator类,它似乎只验证cookie身份验证 我必须在何处以及如何验证json web令牌中的安全戳 我目前的方法是在注册jwtbearermiddle时为OnTokenValidated事件注册一个eventhandler。在这个eventhandler中,我只需查询数据库

我有一个oauth2资源服务器,它使用
jwtbearermiddware
验证访问令牌。现在,如果安全标记已更改,我不认为访问令牌无效。因为看起来这个中间件本身并没有验证安全标记

我找到了
SecurityStampValidator
类,它似乎只验证cookie身份验证

我必须在何处以及如何验证json web令牌中的安全戳


我目前的方法是在注册
jwtbearermiddle
时为
OnTokenValidated
事件注册一个eventhandler。在这个eventhandler中,我只需查询数据库中的安全声明,并将其与令牌中的声明进行比较。当安全标记不相同时,我只需将上下文的
票证
安全令牌
设置为
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();
        }
    }
});
应该这样做吗

应该这样做吗

从技术上讲,是的(您甚至可以使用
SignInManager.ValidateSecurityStampAsync(principal)
来简化代码)

这样说,<强>您应该强烈考虑避免在JWT令牌中存储安全性标记< /强>,因为它们不只是用于确定令牌或cookie是否被撤销的“不透明”字符串,它们还被ASP.NET Core Identity用作生成2FA令牌的唯一熵源:如果将它们按原样存储在JWT中,恶意第三方客户端应用程序可以轻松提取它们,并用于预测登录用户的有效2FA代码

这是一个已知的问题,但恕我直言,没有计划解决它:


如果您想在您的访问令牌中存储安全戳,请考虑使用OpenIDICT的默认(加密)格式,这与ASP.NET内核为其加密认证cookie所使用的格式完全相同。

为什么ASP身份在声明原则中存储安全戳?每次请求验证戳记时都访问数据库不是很有效吗?注意:上述问题在2.1.0中已修复,因此现在将其添加到jwt令牌是安全的吗?如果您的jwt令牌未加密(通常使用JWE),或者您不拥有使用它们的资源服务器,则不安全。ASP.NET车队开了一张单独的票,考虑在未来版本中修复它,但是它在积压中,所以很有可能在一段时间之前不会被修复。