如何使用相同的 Azure AD B2C 租户提示新应用程序的新声明

How to prompt for new claims for a new application using the same Azure AD B2C tenant

我有一个使用 Azure AD B2C 租户的现有应用程序 "A"。在注册过程中,用户被要求输入一个数字(特定于此应用程序 "A"),该数字存储在名称为 "NumberA".

的声明中

现在我想创建一个新应用程序 "B",我希望我的租户的现有用户能够登录该应用程序 "B"。但在他们可以使用它之前,必须提示他们输入一个新号码(特定于应用程序 "B"),该号码存储在名称为 "NumberB".

的声明中

当应用程序 "B" 的新用户注册时,他们只需输入 "B" 的号码。

我认为这一定是可能的,但我不确定该怎么做。

创建新的自定义策略"B2C_AppB_signup_signin"? 然后在新的 "Extensions" 文件中添加新的 Claim "NumberB" 和 "override" 技术配置文件(AAD-UserWriteUsingLogonEmail、AAD-UserReadUsingEmailAddress 等)

或者这是错误的路径..

你走在正确的轨道上。

这可以通过创建两个用户旅程来实现——一个用于应用程序 A,另一个用于应用程序 B——然后将 ClaimsExist 前提条件添加到提示应用程序的两个用户旅程中的编排步骤-具体声明。

例如:对于应用程序 B 的注册或登录用户旅程,您可以在从 Azure Active Directory 读取用户对象后添加以下编排步骤(在最终用户使用现有的帐户或使用新帐户注册),它检查此用户对象是否存在 "extension_NumberB" 声明,如果不存在则提示:

<OrchestrationStep Order="4" Type="ClaimsExchange">
  <Preconditions>
    <Precondition Type="ClaimsExist" ExecuteActionsIf="true">
      <Value>extension_NumberB</Value>
      <Action>SkipThisOrchestrationStep</Action>
    </Precondition>
  </Preconditions>
  <ClaimsExchanges>
    <ClaimsExchange Id="SelfAssertedApplicationBRegistrationExchange" TechnicalProfileReferenceId="SelfAsserted-ApplicationB-Registration" />
  </ClaimsExchanges>
</OrchestrationStep>

然后添加"SelfAsserted-ApplicationB-Registration"技术简介:

<TechnicalProfile Id="SelfAsserted-ApplicationB-Registration">
  <DisplayName>Application B Registration</DisplayName>
  <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.SelfAssertedAttributeProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
  <Metadata>
    <Item Key="ContentDefinitionReferenceId">api.selfasserted.applicationb.registration</Item>
  </Metadata>
  <CryptographicKeys>
    <Key Id="issuer_secret" StorageReferenceId="B2C_1A_TokenSigningKeyContainer" />
  </CryptographicKeys>
  <IncludeInSso>false</IncludeInSso>
  <InputClaims>
    <InputClaim ClaimTypeReferenceId="objectId" Required="true" />
  </InputClaims>
  <OutputClaims>
    <OutputClaim ClaimTypeReferenceId="extension_NumberB" Required="true" />
  </OutputClaims>
  <ValidationTechnicalProfiles>
    <ValidationTechnicalProfile ReferenceId="AAD-UserWriteProfileUsingObjectId" />
  </ValidationTechnicalProfiles>
</TechnicalProfile>

然后您必须将 "extension_NumberB" 声明添加为 "AAD-UserReadUsingObjectId" 技术资料的 <OutputClaim /> 和 "AAD-UserWriteProfileUsingObjectId" 的 <PersistedClaim />技术简介。

虽然您必须管理 2 个政策,但如果您决定拥有第三个或第四个客户,则概述的选项很好,您将需要管理更多的政策。

我建议您创建一个函数应用程序的剩余调用,它接受应用程序 {OIDC:ClientId} 的 client_id,然后 returns 基于它的声明值。

这样你就只有一个策略,然后你可以修改函数应用而不是策略

我在这里详细介绍了这种方法