带有电子邮件邀请的Azure AD B2C注册不显示注册页面

时间:2020-01-18 20:20:54

标签: azure jwt azure-ad-b2c

通过遵循Microsoft的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时,我立即使用包含邀请号(下面有更多详细信息)和一个对象的ID(子项)的JWT令牌登陆https://jwt.ms在AD中先前创建的配置文件,以及标准声明(例如exp,aud等)。

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

一些额外的细节:

  1. 我在ID令牌提示中包含邀请号,而不是电子邮件,因此在整个自定义策略中,ReadOnlyEmail均被邀请号代替。
  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>

1 个答案:

答案 0 :(得分:2)

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

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