0

我们的项目使用 Azure AD 对用户进行身份验证。

从 .net core 3 迁移到 .net core 6 后,我们开始两次使用类型“http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name”获取声明。您可以在下面的屏幕截图中看到这一点。一个基本上是用户的全名(John Doe),另一个是我们需要的电子邮件地址。

在此处输入图像描述

这会破坏我们的身份验证代码,因为我们正在使用HttpContext.User.Identity.Name在我们的数据库中查找用户。.Name该属性从上述类型的索赔中获取价值。

在 .net core 3 下,我们得到了这两个声明,但全名有一个简单的类型“名称”和一个带有电子邮件地址的类型 -“http://schemas.xmlsoap.org/ws/2005/05/identity/claims/姓名”。效果很好。现在,由于我们两次收到相同的声明类型 - 第一个正在填充.Name,它是全名而不是我们想要的电子邮件地址。

我已经有了一些解决方法。

一种是更改财产的来源声明类型.Name

options.TokenValidationParameters.NameClaimType = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/upn";

另一个具有实现IClaimsTransformation接口的简单类,允许我删除/修复重复的声明类型并使其像以前一样工作。

但这两种解决方案都不理想。UPN 不保证它将与 /name 声明相同(并且我们有很多使用 ../name 值注册的用户),据我所知 - 它可能根本不可用。第二种解决方案不可靠,因为很难区分全名和该电子邮件地址(有人可能会将@ 放在用户的全名中,或者带有地址的字段可能会向我们发送不是电子邮件地址形式的东西)。

所以,问题是 - 什么可能导致这个问题?什么可以控制这个?我认为这与 .net 最近的变化有关,因为我们没有对 Azure AD 配置做任何事情。旧代码仍然可以正常工作。

4

2 回答 2

1

终于想通了。

我们已经Microsoft.AspNetCore.Authentication.OpenIdConnect Version="6.0.1"安装了。这取决于System.IdentityModel.Tokens.Jwt Version="6.10.0"

只需更新System.IdentityModel.Tokens.Jwt到 6.10.2 或更高版本。这将解决问题。

提交向 ClaimTypeMapping.cs 添加了新行,这是JwtRegisteredClaimNames.Name我能够在旧版本的 .net 核心中看到的“名称”() 声明类型的映射。这会创建一个重复的“http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name”条目,因为 ClaimTypeMapping.cs aleady 已将“unique_name”( JwtRegisteredClaimNames.UniqueName) 映射到“http://schemas.xmlsoap”。 org/ws/2005/05/identity/claims/name”。

修复了这个,它只是删除了该映射。

如果没有办法升级 - 可以这样做:

JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Remove(JwtRegisteredClaimNames.Name);

应该app.UseAuthentication();在行前。

于 2021-12-23T01:09:29.353 回答
0

感谢您报告您自己的问题。在更新了一些直接依赖项后,我们的一款产品间接依赖于 System.IdentityModel.Tokens.Jwt 的 6.10.0 版本,我们也遇到了同样的问题。

这真的让我们感到困惑,为什么这个产品突然出现登录问题。您的解决方案帮助我们朝着正确的方向前进!:)

于 2022-01-14T11:50:11.637 回答