由于缺少声明信息,Azure AD B2C 自定义策略注册失败

问题描述 投票:0回答:3

我目前正在研究通过自定义电子邮件服务提供商从 Azure AD B2C 中的自定义策略发送电子邮件的可能性。为此,我遵循了 Microsoft 文档中的本教程:https://learn.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 中出现新的输入。在那里输入电子邮件地址,最终成功注册并创建令牌。

azure-ad-b2c identity-experience-framework
3个回答
0
投票

误解,此 XML 片段输入声明翻译为 - “请通过所有用户的

email
属性搜索
signInNames.emailAddress
来找到我这个用户”。

日志中的错误表明,执行此查找操作时,

signInNames.emailAddress
的值为null。这意味着声明
email
从未在编排步骤调用的任何先前技术配置文件中作为输出声明输出。

回顾之前调用的所有技术配置文件,并确定哪个声明中包含用户电子邮件。确保声明是由编排步骤调用的技术配置文件输出的。


0
投票

我遇到了同样的问题,我通过从包含 DisplayControl 作为其 DisplayClaim 的技术配置文件中删除

PartnerClaimType="Verified.Email"
来解决它。


0
投票

在 Jas Suri 评论的帮助下,我能够解决我的问题。

我只是在之前的OrchestrationStep中添加了一个

<OutputClaim ClaimTypeReferenceId="email" />
,并且还添加了转换

<!-- Copy SignInName to Email Claim Type -->
<OutputClaimsTransformations>
  <OutputClaimsTransformation ReferenceId="CopyMailAddress" />
</OutputClaimsTransformations>

看起来像这样:

  <ClaimsTransformation Id="CopyMailAddress" TransformationMethod="FormatStringClaim">
    <InputClaims>
      <InputClaim ClaimTypeReferenceId="signInName" TransformationClaimType="inputClaim" />
    </InputClaims>
    <InputParameters>
      <InputParameter Id="stringFormat" DataType="string" Value="{0}" />
    </InputParameters>
    <OutputClaims>
      <OutputClaim ClaimTypeReferenceId="email" TransformationClaimType="outputClaim" />
    </OutputClaims>
  </ClaimsTransformation>

插入。因此,

signInName
(我在所有 OrchestrationSteps 中使用)被复制到 ClaimType
email
,因此
email
ClaimType 不再为空。

© www.soinside.com 2019 - 2024. All rights reserved.