gpt4 book ai didi

oauth-2.0 - jwtBearerMiddleware 中的安全戳验证器

转载 作者:行者123 更新时间:2023-12-02 03:05:09 25 4
gpt4 key购买 nike

我有一个 oauth2 资源服务器,它使用 JwtBearerMiddleware验证访问 token 。现在我不希望在安全标记发生变化时访问 token 无效。看起来这个中间件本身并不验证安全标记。

我找到了 SecurityStampValidator似乎只验证 cookie 身份验证的类。

我必须在哪里以及如何验证来自我的 json Web token 的安全标记?

我目前的做法是为 OnTokenValidated 注册一个事件处理程序。当我注册 JwtBearerMiddleware 时的事件.在这个事件处理程序中,我只是查询数据库中的安全声明并将其与 token 中的声明进行比较。当安全戳不一样时,我只是设置了 TicketSecurityToken上下文到 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();
}
}
});

这是应该怎么做?

最佳答案

Is this how it should be done?



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

也就是说, 您应该强烈考虑避免存储安全图章 在您的 JWT token 中,因为它们不仅仅是用于确定是否应将 token 或 cookie 视为已撤销的“不透明”字符串,它们还用作 ASP.NET Core Identity 的唯一熵源以生成 2FA token :如果您将它们按原样存储在 JWT 中,它们很容易被恶意的第三方客户端应用程序提取,并用于预测登录用户的有效 2FA 代码。

这是一个已知问题,但 AFAIK,没有计划修复它: https://github.com/aspnet/Identity/issues/626 .

如果要将安全标记存储在访问 token 中,请考虑使用 OpenIddict 的默认(加密)格式,该格式与 ASP.NET Core 用于其加密身份验证 cookie 的格式完全相同。

关于oauth-2.0 - jwtBearerMiddleware 中的安全戳验证器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43281507/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com