gpt4 book ai didi

azure-ad-b2c - Azure AD B2C - 在之前的编排步骤和 Verify.email 中填充输入声明中的电子邮件不工作

转载 作者:行者123 更新时间:2023-12-04 03:57:08 25 4
gpt4 key购买 nike

第一个编排步骤是登录 - 获取电子邮件输出声明第二步是电子邮件验证 - 我想从登录中填充电子邮件并使用电子邮件 OTP 进行验证。

问题-如果电子邮件已填充,则验证按钮不会出现。如果出现验证按钮,则不会填充电子邮件。

最佳答案

我能够通过在 DisplayClaim 中使用 DisplayControl 而不是在 OutputClaim 中使用 Verified.Email 来解决这个用例。

首先在您的 BuildingBlocks ClaimsSchema 中定义这两个属性:

<BuildingBlocks>
<ClaimsSchema>

<ClaimType Id="readOnlyEmail">
<DisplayName>Email</DisplayName>
<DataType>string</DataType>
<UserInputType>Readonly</UserInputType>
</ClaimType>
<ClaimType Id="verificationCode">
<DisplayName>Secondary Verification Code</DisplayName>
<DataType>string</DataType>
<UserHelpText>Enter your email verification code</UserHelpText>
<UserInputType>TextBox</UserInputType>
</ClaimType>

<!-- Other claims you have defined -->

</ClaimsSchema>
</BuildingBlocks>

我们要将电子邮件属性复制到 readOnlyEmail 属性中,以便我们可以将其显示在屏幕上,并且在验证电子邮件一次性密码 (OTP) 时使用 verificationCode 属性。坚持在这里。

在 BuildingBlock 中定义一个 ClaimsTransformation,ClaimsTransformations 将电子邮件复制到 readOnlyEmail。

<BuildingBlocks>

<!-- ClaimsSchema -->

<ClaimsTransformations>
<ClaimsTransformation Id="CopyEmailAddress" TransformationMethod="CopyClaim">
<InputClaims>
<InputClaim ClaimTypeReferenceId="email" TransformationClaimType="inputClaim"/>
</InputClaims>
<OutputClaims>
<OutputClaim ClaimTypeReferenceId="readOnlyEmail" TransformationClaimType="outputClaim"/>
</OutputClaims>
</ClaimsTransformation>
</ClaimsTransformations>

<!-- ContentDefinitions, DisplayControls, etc. -->

</BuildingBlocks>

修改 api.selfasserted 的 ContentDefinition 中的 DataUri 元素,使其成为 2.0.0 版本并包含“contract”标签。您必须这样做才能让 DisplayClaims 发挥作用。

api.selfasserted ContentDefinition 现在应该如下所示:

<BuildingBlocks>

<!-- ClaimsSchema, ClaimsTransformations -->

<ContentDefinitions>
<ContentDefinition Id="api.selfasserted">
<LoadUri>~/tenant/templates/AzureBlue/selfAsserted.cshtml</LoadUri>
<RecoveryUri>~/common/default_page_error.html</RecoveryUri>
<DataUri>urn:com:microsoft:aad:b2c:elements:contract:selfasserted:2.0.0</DataUri>
<Metadata>
<Item Key="DisplayName">Collect information from user page</Item>
</Metadata>
</ContentDefinition>
</ContentDefinitions>

<!-- DisplayControls, etc. -->

</BuildingBlocks>

这里唯一的变化是 ContentDefinition 中的 DataUri 元素。请注意,我们更新了它以包含“契约(Contract)”一词,并且它的版本现在是 2.0.0。

然后在 BuildingBlocks 中定义一个 DisplayControl,使用我们的 readOnlyEmail 和 verficationCode ClaimTypes 的 DisplayControls:

<BuildingBlocks>

<!-- ClaimsSchema, ClaimsTransformations, ContentDefinitions, etc -->

<DisplayControls>
<DisplayControl Id="emailVerificationControl" UserInterfaceControlType="VerificationControl">
<InputClaims>
<InputClaim ClaimTypeReferenceId="readOnlyEmail" />
</InputClaims>
<DisplayClaims>
<DisplayClaim ClaimTypeReferenceId="readOnlyEmail" />
<DisplayClaim ClaimTypeReferenceId="verificationCode" ControlClaimType="VerificationCode" />
</DisplayClaims>
<Actions>
<Action Id="SendCode">
<ValidationClaimsExchange>
<ValidationClaimsExchangeTechnicalProfile TechnicalProfileReferenceId="AadSspr-SendCode" />
</ValidationClaimsExchange>
</Action>
<Action Id="VerifyCode">
<ValidationClaimsExchange>
<ValidationClaimsExchangeTechnicalProfile TechnicalProfileReferenceId="AadSspr-VerifyCode" />
</ValidationClaimsExchange>
</Action>
</Actions>
</DisplayControl>
</DisplayControls>

</BuildingBlocks>

注意这里我们显示的是 readOnlyEmail,第二个 DisplayClaim for verificationCode 用于在发送到您的电子邮件后收集 OTP。

另请注意指向我们尚未定义的 TechnicalProfiles 的操作。它们对应于屏幕上的按钮,将发送电子邮件并验证代码。让我们接下来定义它们。您可以将它们放在任何您喜欢的 ClaimsProvider 中:

<TechnicalProfile Id="AadSspr-SendCode">
<DisplayName>Send Code</DisplayName>
<Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.AadSsprProtocolProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
<Metadata>
<Item Key="Operation">SendCode</Item>
</Metadata>
<InputClaims>
<InputClaim ClaimTypeReferenceId="readOnlyEmail" PartnerClaimType="emailAddress"/>
</InputClaims>
</TechnicalProfile>

<TechnicalProfile Id="AadSspr-VerifyCode">
<DisplayName>Verify Code</DisplayName>
<Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.AadSsprProtocolProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
<Metadata>
<Item Key="Operation">VerifyCode</Item>
</Metadata>
<InputClaims>
<InputClaim ClaimTypeReferenceId="verificationCode" PartnerClaimType="verificationCode" />
<InputClaim ClaimTypeReferenceId="readOnlyEmail" PartnerClaimType="emailAddress"/>
</InputClaims>
</TechnicalProfile>

这些 TechnicalProfiles 正在利用 AadSsprProtocolProvider 发送和验证代码。 MS 在这里有很好的文档:https://learn.microsoft.com/en-us/azure/active-directory-b2c/aad-sspr-technical-profile

快到了。现在让我们创建一个 SelfAssertedAttributeProvider TechnicalProfile 来利用我们新的 DisplayClaim 来进行内联验证。

在您喜欢的任何 ClaimsProvider 中创建此 TechnicalProfile:

<TechnicalProfile Id="SelfAsserted-VerifyEmail">
<DisplayName>Verify Email</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</Item>
</Metadata>
<IncludeInSso>false</IncludeInSso>
<InputClaimsTransformations>
<InputClaimsTransformation ReferenceId="CopyEmailAddress" />
</InputClaimsTransformations>
<InputClaims>
<InputClaim ClaimTypeReferenceId="email" />
<InputClaim ClaimTypeReferenceId="readOnlyEmail" />
</InputClaims>
<DisplayClaims>
<DisplayClaim DisplayControlReferenceId="emailVerificationControl" />
</DisplayClaims>
</TechnicalProfile>

此 TechnicalProfile 将电子邮件作为输入,使用 InputClaimsTransformation 将其复制到我们的 readOnlyEmail,然后在我们新的 emailVerificationControl DisplayClaim 中使用 readOnlyEmail。该 emailVerficationControl 然后向用户显示电子邮件的只读值,有一个发送代码的按钮,然后能够在发送后验证它。

您需要做的最后一件事是在您的 UserJourney、OrchestrationSteps 中使用这个新的 TechnicalProfile,如下所示:

<OrchestrationStep Order="X" Type="ClaimsExchange">
<ClaimsExchanges>
<ClaimsExchange Id="SelfAsserted-VerifyEmail-CE" TechnicalProfileReferenceId="SelfAsserted-VerifyEmail"/>
</ClaimsExchanges>
</OrchestrationStep>

此技术解决了您遇到问题的用例。

关于azure-ad-b2c - Azure AD B2C - 在之前的编排步骤和 Verify.email 中填充输入声明中的电子邮件不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63681669/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com