azure - 带有电子邮件邀请的 Azure AD B2C 注册不显示注册页面
问题描述
我按照微软的这个 Azure AD B2C 示例在我的项目中加入了使用电子邮件邀请注册流程:
https://github.com/azure-ad-b2c/samples/tree/master/policies/invite
出于测试原因,我将邀请 URL 的 redirect_uri 参数设置为https://jwt.ms,我对工作流程的期望是:
- 单击邀请 URL 将我带到 b2clogin
- Azure B2C 验证 ID 提示令牌
- 我登陆注册页面,并在 ID 令牌提示中预先填充了值
- 成功注册后,我被重定向到https://jwt.ms
然而,我的期望没有得到满足,在单击邀请 URL 后,我立即登陆https://jwt.ms并使用包含邀请号(下面有更多详细信息)和对象 ID(子)的 JWT 令牌之一之前在 AD 中创建的配置文件,以及 exp、aud 等标准声明。
我怀疑我对邀请工作流程如何运作的理解存在差距。我应该注意和修改哪些代码/政策领域以确保成功邀请注册?
一些额外的细节:
- 我在 ID 令牌提示中包含了邀请号,而不是电子邮件,因此在整个自定义策略中,ReadOnlyEmail 被替换为 InvitationNumber。
- 我已将我的正常注册政策中的字段复制到邀请政策中,希望他的用户应该能够使用他们喜欢的任何电子邮件进行注册,只要它经过 B2C 验证(因此从示例技术配置文件中删除了“False”)邀请注册)
- 邀请号也设置为我的应用程序的输出声明,以便在从 B2C 收到 JWT 令牌后对其进行处理。
- 邀请策略使用与我正常登录/注册相同的策略基础。
- 在共享策略库中,我在我的普通 JwtIssuer 旁边添加了一个用于 ID 令牌提示验证的新声明提供程序,它引用了我的应用程序用来签署 ID 令牌提示并在 SignUpInvitation 用户旅程的最后一步中使用它的签名证书. 我不确定这是不是正确的事情,但是一旦我使用 JwtIssuer,我会在 B2C 中收到一个错误,即它无法验证 ID 令牌提示的签名。
- 注册的技术配置文件如下,它是从用户旅程中调用的:
<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>
解决方案
更改<UseTechnicalProfileForSessionManagement ReferenceId="SM-AAD" />
为<UseTechnicalProfileForSessionManagement ReferenceId="SM-Noop" />
。由于 SSO,您似乎正在跳过该页面。
https://github.com/azure-ad-b2c/samples/blob/master/policies/invite/policy/SignUpInvitation.xml#L100
推荐阅读
- c++ - 将屏幕截图位图转换为 vncviewer 的字节返回空
- c++ - 在类中打印 (C++)
- angular - 准备 Angular 发布请求
- javascript - 尝试编辑我的表单以更新用户详细信息,但表单拒绝在反应中更新
- python - 如何计算两个高斯混合的单个均值、标准差、相对比例?
- javascript - string.slice(0, -1) 如何处理 javascript 中的字符串?
- c# - 如何将单词附加到带有双引号的特定字符串?
- django - django 数字海洋 git
- android - 一旦活动从另一个功能开始,如何共享数据?
- schema.org - 我应该将哪种 Schema.org 类型用于数字商品服务?