由于缺少声明信息,因此无法使用Azure AD B2C自定义策略进行注册

时间:2020-06-30 14:41:22

标签: azure-ad-b2c identity-experience-framework

我目前正在研究通过自定义电子邮件服务提供商从Azure AD B2C中的自定义策略发送电子邮件的可能性。为此,我遵循Microsoft文档https://docs.microsoft.com/en-us/azure/active-directory-b2c/custom-email-sendgrid中的本教程。

由于我们已经使用自定义策略已有相当一段时间了,所以我尝试立即将本教程采纳为我们自己的自定义策略:我们使用多步骤注册过程,其中电子邮件验证步骤为第一步,个人数据步骤为第二步。

我成功地连接了电子邮件服务提供商,并通过它发送代码,并在成功验证电子邮件地址之后继续进行注册过程的第二步。

但是,当我想完成注册的第二步并在AD中实际创建用户时,我会在前端看到以下错误:

无法验证所提供的信息。

为了获得更多的见解,我在策略中激活了开发人员模式,并在Application Insights中检查了以下错误的踪迹:

在租户ID为“ B2C_1A_signup_notificationtest”的索赔主体的索赔集合中找不到指定为标识符索赔类型的索赔类型“ signInNames.emailAddress”。

在技术资料AAD-UserWriteUsingLogonEmail中引起。但是,如您在下面的技术资料中所见,上述声明类型signInNames.emailAddress是通过技术资料的输入声明中的partnerClaimType指令派生的:

<TechnicalProfile Id="AAD-UserWriteUsingLogonEmail">
    <Metadata>
        <Item Key="Operation">Write</Item>
        <Item Key="RaiseErrorIfClaimsPrincipalAlreadyExists">true</Item>
    </Metadata>
    <IncludeInSso>false</IncludeInSso>
    <InputClaims>
<!-- THIS IS THE LINE I AM REFERRING TO: -->
        <InputClaim ClaimTypeReferenceId="email" PartnerClaimType="signInNames.emailAddress"
                    Required="true"/>
    </InputClaims>
    <PersistedClaims>
        <!-- Required claims -->
        <PersistedClaim ClaimTypeReferenceId="email" PartnerClaimType="signInNames.emailAddress"/>
        <PersistedClaim ClaimTypeReferenceId="newPassword" PartnerClaimType="password"/>
        <PersistedClaim ClaimTypeReferenceId="displayName" DefaultValue="unknown"/>
        <PersistedClaim ClaimTypeReferenceId="passwordPolicies"
                        DefaultValue="DisablePasswordExpiration"/>

        <!-- Optional claims. -->
        <PersistedClaim ClaimTypeReferenceId="extension_Salutation"/>
        <PersistedClaim ClaimTypeReferenceId="givenName"/>
        <PersistedClaim ClaimTypeReferenceId="surname"/>
        <PersistedClaim ClaimTypeReferenceId="country"/>
        <PersistedClaim ClaimTypeReferenceId="extension_Company"/>
        <PersistedClaim ClaimTypeReferenceId="extension_Kundennummer"/>
    </PersistedClaims>
    <OutputClaims>
        <OutputClaim ClaimTypeReferenceId="objectId"/>
        <OutputClaim ClaimTypeReferenceId="newUser" PartnerClaimType="newClaimsPrincipalCreated"/>
        <OutputClaim ClaimTypeReferenceId="authenticationSource"
                     DefaultValue="localAccountAuthentication"/>
        <OutputClaim ClaimTypeReferenceId="userPrincipalName"/>
        <OutputClaim ClaimTypeReferenceId="signInNames.emailAddress"/>
    </OutputClaims>
    <IncludeTechnicalProfile ReferenceId="AAD-Common"/>
    <UseTechnicalProfileForSessionManagement ReferenceId="SM-AAD"/>
</TechnicalProfile> 

所以我的问题是:我在哪里可以寻求进一步的调试?我在寻找正确的位置还是错误消息表示完全不同的内容?

另外请注意:由于身份体验框架配置的性质,因此涉及很多xml。因此,我在这里发布了依赖方策略文件,其中也包括要点,其中包括服务连接的相关部分:https://gist.github.com/mmaedler/0a555fc3f9e6036e235a15419e7afdd5

更新另外,我已经将所有相关(希望)技术配置文件以及UserJourney本身添加到了这个新要点:https://gist.github.com/mmaedler/19ab309897f3a7d993816eb34adc7edb

我还根据您的建议进行了进一步调查。由于我覆盖了技术资料LocalAccountSignUpMultiStep-1,以使用我们的邮寄后端替换当前的内置代码验证,因此表明此输出结果缺少以下技术资料所期望的字段/格式的电子邮件地址在步骤2中,我向LocalAccountSignUpMultiStep-2添加了一个新的OutputClaim,并带有ClaimTypeReferenceId="email",这导致在注册步骤2中出现新的输入。在此输入电子邮件地址成功完成了注册和令牌的创建。 / p>

1 个答案:

答案 0 :(得分:0)

误解,此XML代码段输入声明转换为-“请通过所有用户的email属性搜索signInNames.emailAddress来找到我这个用户”。

日志中的错误指出,执行此查找操作时,signInNames.emailAddress的值为。这意味着声明email从未在业务流程步骤调用的任何先前技术档案中作为输出声明输出。

回顾一下在此之前调用的所有技术资料,并确定其中包含用户电子邮件的声明。确保声明是由业务流程步骤调用的技术档案输出的。