在Azure B2C中,是否有一种方法可以通过声明发送用户主体名称?

7
我在将Azure B2C中当前已登录用户的用户名传递到我的Blazor Web应用程序时遇到了一些问题。本质上,我想创建一个用户名帐户,其中用户名是用户主体名称。最初我使用的是电子邮件注册策略,其中显示名称作为用户名。但是,B2C不强制执行显示名称必须唯一,因此存在某种固有问题。没有任何声明返回包含用户名,因此我无法在我的Blazor应用程序中跟踪谁已登录或显示其用户名。我可以采取几种选择,我想知道哪个实现起来最容易/如何实现它,因为过去几个小时我都在抓狂。

  • 在创建B2C帐户时,将用户主体名称同时设置为显示名称
  • 通过声明发送用户主体名称(不确定如何执行此操作)
  • 使用显示名称进行电子邮件注册,但以某种方式强制执行B2C确保显示名称唯一
  • 其他方法,以使B2C用户具有唯一的显示名称

提前致谢!


你在 b2c 中使用本地帐户吗?用户流程/自定义策略?你是在谈论 signInNames.userName 吗?所以你想要一个与显示名称相同的唯一用户名? - Thomas
目前,我正在使用b2c中的本地帐户。在注册/登录用户流程中,在身份提供者本地帐户下,您可以选择“电子邮件注册”或“用户ID注册”。如果我选择电子邮件注册,则电子邮件是唯一的标识符,但是我希望我的用户拥有用户名而不是电子邮件。问题在于,如果您使用显示名称,则b2c不会检查其是否唯一。用户登录ID适用于我的目的,但是在我的Blazor Web应用程序中,我无法查看用户名,因为它保存为用户主体名称,在Azure中可见。 - Zami77
但是显示名称与用户名不同。您需要显示名称吗?您可以坚持使用用户名,这应该没问题。 - Thomas
用户名可以,但在Blazor中我无法获取该信息。B2C只发送电子邮件和显示名称作为可检查的声明。据我所知,没有获取用户主体名称的函数调用。 - Zami77
你应该能够自定义从B2C返回的索赔。 - Thomas
您可以自定义 b2c 中的声明,但是它们没有“用户主体名称”或“用户名”作为选项。如果我将自定义属性返回为声明,则无法确保其唯一性。我真的觉得很奇怪,b2c 竟然没有像用户名这样简单的设置。 - Zami77
2个回答

5
您需要使用自定义策略:https://aka.ms/ief。用户流中无法返回用户名令牌。
使用自定义策略,您可以使用用户名进行用户注册,并将其用户名(signInNames.username属性,在Azure门户中显示为userPrincipalName)返回到令牌中。
您可以使用我的工具此处快速部署自定义策略。并使用样例文件夹名称 username-signup-or-signin此页面上快速部署用户名示例。

这是一个非常棒的工具,它真的帮了我很多忙!我现在知道登录名作为SUSI自定义策略的用户名声明返回。我仍然需要对自定义策略进行一些调整,但感谢您帮助我完成了95%的工作。 - Zami77
有没有办法我可以只生成文件并下载它们,而不必直接上传到B2C? - tasin95

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

Application Claims

如上所示的例子列出了所有其他可用的声明,因为有些声明始终会被返回,例如用户名称。
您可以配置在身份提供者中用于登录的声明(模式):
Identity Provider config 然后您收到的声明如下:

Claims list

但是,您可以看到没有任何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发布的工具确实有助于启动自定义策略。 - Zami77

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接