对于 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 中配置用于登录的声明(模式):
您收到的索赔如下:
但正如您所见,没有任何 userPrincipalName
或 signinNames
。
这是 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 获取 ASPCore 中的 OID 声明