对于 Azure B2C,是不是可以通过声明发送用户主体名称?

Posted

技术标签:

【中文标题】对于 Azure B2C,是不是可以通过声明发送用户主体名称?【英文标题】:For Azure B2C, is there a way to send the user principal name via claims?对于 Azure B2C,是否可以通过声明发送用户主体名称? 【发布时间】:2021-11-08 08:04:27 【问题描述】:

我在将当前登录用户的用户名从 Azure b2c 获取到我的 Blazor Web 应用时遇到了一些问题。本质上,我想创建一个用户名帐户,其中用户名是用户主体名称。我最初使用的电子邮件注册策略以显示名称作为用户名。但是,b2c 不强制显示名称是唯一的,因此存在一个固有的问题。没有任何声明包含用户名,因此我无法在我的 Blazor 应用程序中密切关注谁已登录或显示他们的用户名。我可以做一些选择,我很好奇哪一个最容易实施/如何实施,因为过去几个小时我一直在为此烦恼。

在创建 b2c 帐户时,获取用户主体名称并将其设为显示名称 是否通过声明发送用户主体名称(不确定如何执行此操作) 是否使用显示名称注册电子邮件,但以某种方式强制执行 b2c 以确保显示名称是唯一的 为来自 b2c 的用户提供唯一显示名称的其他方式

提前致谢!

【问题讨论】:

您是否在 b2c 中使用本地帐户?用户流/自定义策略?你在说signInNames.userName 吗?所以你想要一个与显示名称相同的唯一用户名? 目前,我在 b2c 中使用本地帐户。在注册/登录用户流程中,在身份提供商本地帐户下,您可以选择“电子邮件注册”或“用户 ID 注册”。如果我选择电子邮件注册,电子邮件是唯一标识符,但是,我希望我的用户拥有用户名而不是电子邮件。问题是,如果您使用显示名称,b2c 不会检查它是否是唯一的。用户签名 ID 适用于我的目的,但我无法在 Blazor Web 应用程序中查看用户名是什么,因为它保存为用户主体名称,可在 Azure 中查看。 但显示名称与用户名不同。你需要显示名称吗?你可以坚持使用用户名,应该没问题 用户名很好,但我无法在 Blazor 中提取该信息。 B2C 仅发送电子邮件和显示名称作为我可以检查的声明。据我所知,没有函数调用来获取用户主体名称。 您应该能够自定义从 b2c 返回的声明 【参考方案1】:

您需要使用自定义策略:https://aka.ms/ief。用户流不会在令牌中返回用户名。

使用自定义策略,您可以使用用户名注册用户,并将其用户名(signInNames.username 属性,在 Azure 门户中显示为 userPrincipalName)返回到令牌中。

您可以使用我的工具here 快速部署自定义策略。并使用this page 和示例文件夹名称 username-signup-or-signin 快​​速部署用户名示例。

【讨论】:

很棒的工具,真的帮了很多忙!我现在看到登录名作为用户名 SUSI 自定义策略的声明返回。我仍然需要对自定义政策进行一些调整,但感谢您帮助我完成了 95% 的工作。【参考方案2】:

如果您需要任何其他声明,您需要在 Azure AD BC 租户中输入并从您的用户流配置应用程序声明,在以下示例中,用户流称为 B2C_1_signupsignin

如您所见,上面的示例列出了所有其他可用声明,因为圆顶声明总是作为用户名返回。

您可以在 Identity Provider 中配置用于登录的声明(模式):

您收到的索赔如下:

但正如您所见,没有任何 userPrincipalNamesigninNames。 这是 Azure AD B2C 中的一个已知问题,在用户流清单中包含此声明不起作用。 我找到的唯一解决方案是上传您的自定义策略并添加:<OutputClaim ClaimTypeReferenceId = "signInName" />

但这仅适用于本地帐户。 如果您还想为外部(社交)帐户添加登录名,则需要映射它们,例如:<OutputClaim ClaimTypeReferenceId="email" PartnerClaimType="upn" />

在此处查看基本源 XML:https://github.com/azure-ad-b2c/samples/tree/master/policies/sign-up-with-social-and-local-account

【讨论】:

谢谢,这绝对是正确的方向。 Jas Suri 发布的工具确实有助于启动自定义策略。

以上是关于对于 Azure B2C,是不是可以通过声明发送用户主体名称?的主要内容,如果未能解决你的问题,请参考以下文章

将声明添加到令牌 Azure B2C

Azure B2C:如何在 JWT 令牌中获得“组”声明

如何向 azure b2c 访问令牌添加自定义声明?

如何从 Azure B2C 获取 ASPCore 中的 OID 声明

在 Azure B2C 中获取刷新令牌,Azure AD App 是第三方 IDP

Azure B2C注册。隐藏密码字段,直到输入验证码?