httpContext.User 声明在通过 .NET 6 中的自定义身份验证处理程序后未更新

问题描述 投票:0回答:1

我正在使用 .Net 6 WebApi。我需要支持双重身份验证方案。一种方案是使用标准 OIDC 提供的访问令牌,为此我使用带有令牌验证参数的标准 AddJwtBearer 扩展方法。对于第二种方案,我使用 .Net 自己的 JwtBearerHandler.cs 代码创建了一个自定义身份验证处理程序作为参考。

https://github.com/dotnet/aspnetcore/blob/a450cb69b5e4549f5515cdb057a68771f56cefd7/src/Security/Authentication/JwtBearer/src/JwtBearerHandler.cs

初始实现,除了从Bearer改为CustomBearer外,我没有做任何其他改动,以便在初始开发时更容易排查问题。

我还有一些自定义的 AuthorizationHandler 类,用于应用自定义授权策略。

我面临的问题是,即使传入 JWT 的身份验证在自定义身份验证处理程序中成功进行,并且我使用传入 JWT 的声明原则设置 TokenValidateContext,我也没有看到 httpContext.User 已更新为正确的身份。

即使在 Custom Authorization Handler 的 HandleRequirementAsync 方法中,AuthorizationHandlerContext 也没有经过身份验证的用户身份/原则/声明信息。

我遇到这个问题,只有当身份验证由我的自定义处理程序类处理时。如果我传递标准 OIDC 提供的 access_token、httpContext.User 和 AuthorizationHandlerContext,两者都反映了经过身份验证的用户。

所以我想我在完成身份验证后遗漏了一些步骤,这导致 httpContext.User 不反映经过身份验证的用户原则信息。

在我的自定义身份验证处理程序的 HandleAuthenticateAsync 方法中,在成功验证令牌后,我是否应该简单地用从令牌创建的 Principle 覆盖 httpContext.User?或者是否有任何其他标准方法来更新值,因为参考 JwtBearerHandler.cs 不执行任何此类操作。

对此的任何指导都会非常有帮助。

谢谢!

c# asp.net-core authentication authorization
1个回答
0
投票

我想通了这个问题。之所以在AuthorizationHandlerContext中没有得到认证用户原则是因为在注册策略时,我只添加了不记名认证方案。因此,当传入的 JWT 通过不同的身份验证方案进行身份验证时,身份未被设置。

这也意味着我真的不需要自定义身份验证处理程序。所以我添加了一个自定义标头来让我确定要使用的身份验证方案,然后返回使用标准的 AddJwtBearer 扩展方法,该方法使用内置的 JwtBearerHandler 进行身份验证。

© www.soinside.com 2019 - 2024. All rights reserved.