我们的项目使用 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 配置做任何事情。旧代码仍然可以正常工作。