我目前正在研究通过自定义电子邮件服务提供商从 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 中出现新的输入。在那里输入电子邮件地址,最终成功注册并创建令牌。
误解,此 XML 片段输入声明翻译为 - “请通过所有用户的
email
属性搜索 signInNames.emailAddress
来找到我这个用户”。
日志中的错误表明,执行此查找操作时,
signInNames.emailAddress
的值为null。这意味着声明 email
从未在编排步骤调用的任何先前技术配置文件中作为输出声明输出。
回顾之前调用的所有技术配置文件,并确定哪个声明中包含用户电子邮件。确保声明是由编排步骤调用的技术配置文件输出的。
我遇到了同样的问题,我通过从包含 DisplayControl 作为其 DisplayClaim 的技术配置文件中删除
PartnerClaimType="Verified.Email"
来解决它。
在 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 不再为空。