【问题标题】:Add additional claims on TokenValidated event在 TokenValidated 事件上添加额外的声明
【发布时间】:2019-01-07 20:26:24
【问题描述】:

在我的 ASP.NET Core 1.1 应用程序中,我使用 JWT 令牌进行身份验证。 在某些情况下,我需要向用户添加令牌中未提供的其他声明。

所以我连接到IJwtBearerEvents.TokenValidated 事件并尝试在该事件处理程序中添加其他声明。我尝试了几件事:

// (1) - doesn't work
((ClaimsIdentity)context.HttpContext.User.Identity).AddClaim(myNewClaim);

// (2) - doesn't work
var jwtToken = context.SecurityToken as JwtSecurityToken;
((ICollection<Claim>)jwtToken.Claims).Add(myNewClaim);

// (3) - doesn't work
context.HttpContext.User.AddIdentity(new ClaimsIdentity(new Claim[] { myNewClaim }));

无论我怎么做,我都没有在控制器操作中的User.Claims 中看到这些额外的声明。

在成功验证不记名令牌后添加额外声明的正确方法是什么?

【问题讨论】:

  • 令牌由外部系统生成。这就是为什么我需要在令牌验证上附加声明(不幸的是......)
  • 即使对于 ASP.NET Core 2.0,Adding custom claims to a user during authentication 有帮助吗?
  • 如果您尝试将声明附加到现有 JWT,则一旦发出 JWT,就无法修改 JWT,您可以使用 JWTSecurityToken 和接收到的令牌的有效负载发出新的 JWT。
  • @MarkG:感谢您提供的链接。在 ASP.NET Core 1.1 中,上下文对象不包含 Principal 字段。我能找到的最接近的是context.HttpContext.User,它让我可以访问ClaimsPrincipal 对象。这将导致我们回到我上面的第三次尝试,这不起作用。

标签: authentication asp.net-core claims-based-identity asp.net-core-1.1


【解决方案1】:

@MarkG 链接的文章显示了访问声明的第四种方法 - 这个方法有效:

// (4) - works!
(context.Ticket.Principal.Identity as ClaimsIdentity).AddClaim(myNewClaim);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-07
    • 2017-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多