【发布时间】:2022-01-24 01:59:09
【问题描述】:
我们的项目使用 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 /声明/名称”。效果很好。现在,由于我们两次收到相同的声明类型 - 第一个被填充为 .Name,这是全名,而不是我们想要的电子邮件地址。
我已经有了一些解决方法。
其中一个正在更改.Name 属性的源声明类型:
options.TokenValidationParameters.NameClaimType = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/upn";
另一个,有一个实现IClaimsTransformation接口的简单类,
允许我删除/修复重复的声明类型并使其像以前一样工作。
但这两种解决方案都不理想。 UPN 不保证它与 /name 声明相同(并且我们有很多使用 ../name 值注册的用户),据我所知 - 它可能根本不可用。 第二种解决方案不可靠,因为很难区分全名和该电子邮件地址(有人可能会将 @ 放在用户的全名中,或者带有地址的字段可能会向我们发送不是电子邮件地址形式的东西)。
所以,问题是 - 什么可能导致这个问题?什么可以控制这个?我认为这与 .net 最近的变化有关,因为我们没有对 Azure AD 配置做任何事情。旧代码仍然可以正常工作。
【问题讨论】:
标签: c# azure-active-directory openid-connect asp.net-core-6.0