首页 > 解决方案 > 带有电子邮件邀请的 Azure AD B2C 注册不显示注册页面

问题描述

我按照微软的这个 Azure AD B2C 示例在我的项目中加入了使用电子邮件邀请注册流程:

https://github.com/azure-ad-b2c/samples/tree/master/policies/invite

出于测试原因,我将邀请 URL 的 redirect_uri 参数设置为https://jwt.ms,我对工作流程的期望是:

  1. 单击邀请 URL 将我带到 b2clogin
  2. Azure B2C 验证 ID 提示令牌
  3. 我登陆注册页面,并在 ID 令牌提示中预先填充了值
  4. 成功注册后,我被重定向到https://jwt.ms

然而,我的期望没有得到满足,在单击邀请 URL 后,我立即登陆https://jwt.ms并使用包含邀请号(下面有更多详细信息)和对象 ID(子)的 JWT 令牌之一之前在 AD 中创建的配置文件,以及 exp、aud 等标准声明。

我怀疑我对邀请工作流程如何运作的理解存在差距。我应该注意和修改哪些代码/政策领域以确保成功邀请注册?

一些额外的细节:

  1. 我在 ID 令牌提示中包含了邀请号,而不是电子邮件,因此在整个自定义策略中,ReadOnlyEmail 被替换为 InvitationNumber。
  2. 我已将我的正常注册政策中的字段复制到邀请政策中,希望他的用户应该能够使用他们喜欢的任何电子邮件进行注册,只要它经过 B2C 验证(因此从示例技术配置文件中删除了“False”)邀请注册)
  3. 邀请号也设置为我的应用程序的输出声明,以便在从 B2C 收到 JWT 令牌后对其进行处理。
  4. 邀请策略使用与我正常登录/注册相同的策略基础。
  5. 在共享策略库中,我在我的普通 JwtIssuer 旁边添加了一个用于 ID 令牌提示验证的新声明提供程序,它引用了我的应用程序用来签署 ID 令牌提示并在 SignUpInvitation 用户旅程的最后一步中使用它的签名证书. 我不确定这是不是正确的事情,但是一旦我使用 JwtIssuer,我会在 B2C 中收到一个错误,即它无法验证 ID 令牌提示的签名。
  6. 注册的技术配置文件如下,它是从用户旅程中调用的:
    <TechnicalProfile Id="LocalAccountSignUpWithInvitationToken">
      <DisplayName>Email signup</DisplayName>
      <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.SelfAssertedAttributeProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
      <Metadata>
        <Item Key="IpAddressClaimReferenceId">IpAddress</Item>
        <Item Key="ContentDefinitionReferenceId">api.localaccountsignup</Item>
        <Item Key="language.button_continue">Create</Item>
      </Metadata>
      <InputClaimsTransformations>
        <InputClaimsTransformation ReferenceId="CopyInvitationToken" />
      </InputClaimsTransformations>
      <InputClaims>
        <InputClaim ClaimTypeReferenceId="extension_InvitationToken" />
        <InputClaim ClaimTypeReferenceId="email" />
      </InputClaims>
      <OutputClaims>
        <OutputClaim ClaimTypeReferenceId="objectId" />
        <OutputClaim ClaimTypeReferenceId="email" PartnerClaimType="Verified.Email" Required="true" />
        <OutputClaim ClaimTypeReferenceId="newPassword" Required="true" />
        <OutputClaim ClaimTypeReferenceId="reenterPassword" Required="true" />
        <OutputClaim ClaimTypeReferenceId="executed-SelfAsserted-Input" DefaultValue="true" />
        <OutputClaim ClaimTypeReferenceId="authenticationSource" />
        <OutputClaim ClaimTypeReferenceId="newUser" />

        <!-- Optional claims, to be collected from the user -->
        <OutputClaim ClaimTypeReferenceId="givenName" />
        <OutputClaim ClaimTypeReferenceId="surName" />
        <OutputClaim ClaimTypeReferenceId="extension_InvitationToken" />
      </OutputClaims>
      <ValidationTechnicalProfiles>
        <ValidationTechnicalProfile ReferenceId="AAD-UserWriteUsingLogonEmail" />
      </ValidationTechnicalProfiles>
      <UseTechnicalProfileForSessionManagement ReferenceId="SM-AAD" />
    </TechnicalProfile>      

7. 用户旅程是:

  <UserJourneys>
    <UserJourney Id="SignUpInvitation">
      <OrchestrationSteps>
        <!--Read the input claims from the id_token_hint-->
        <OrchestrationStep Order="1" Type="GetClaims" CpimIssuerTechnicalProfileReferenceId="IdTokenHint_ExtractClaims" />
        <!-- Check if user tries to run the policy without invitation -->
        <OrchestrationStep Order="2" Type="ClaimsExchange">
         <Preconditions>
            <Precondition Type="ClaimsExist" ExecuteActionsIf="true">
              <Value>extension_InvitationToken</Value>
              <Action>SkipThisOrchestrationStep</Action>
            </Precondition>
          </Preconditions>        
          <ClaimsExchanges>
            <ClaimsExchange Id="SelfAsserted-Unsolicited" TechnicalProfileReferenceId="SelfAsserted-Unsolicited"/>
          </ClaimsExchanges>
        </OrchestrationStep>
        <!-- Self-asserted sign-up page -->
        <OrchestrationStep Order="3" Type="ClaimsExchange">
          <ClaimsExchanges>
            <ClaimsExchange Id="LocalAccountSignUpWithInvitationToken" TechnicalProfileReferenceId="LocalAccountSignUpWithInvitationToken"/>
          </ClaimsExchanges>
        </OrchestrationStep>
        <!-- Issue an access token-->
        <OrchestrationStep Order="4" Type="SendClaims" CpimIssuerTechnicalProfileReferenceId="JwtIdTokenHintValidator"/>
      </OrchestrationSteps>
      <ClientDefinition ReferenceId="DefaultWeb"/>
    </UserJourney>
  </UserJourneys>

标签: azurejwtazure-ad-b2c

解决方案


更改<UseTechnicalProfileForSessionManagement ReferenceId="SM-AAD" /><UseTechnicalProfileForSessionManagement ReferenceId="SM-Noop" />。由于 SSO,您似乎正在跳过该页面。

https://github.com/azure-ad-b2c/samples/blob/master/policies/invite/policy/SignUpInvitation.xml#L100


推荐阅读