Azure AD B2C - 自定义策略中的“电子邮件”声明
Posted
技术标签:
【中文标题】Azure AD B2C - 自定义策略中的“电子邮件”声明【英文标题】:Azure AD B2C - "emails" claim in custom policy 【发布时间】:2018-03-28 10:27:46 【问题描述】:我正在寻找一种将emails
声明(电子邮件收集)添加到 Azure AD B2C 自定义策略的方法。此应用程序声明可直接从 Azure 门户获得,但我找不到在需要创建的自定义策略中实现此功能的方法。
我想要实现的是为我的 WebApp 用户提供 Azure AD B2C 身份验证,并将 Azure AD 身份验证作为员工的自定义身份验证提供程序,因此这意味着我需要添加两次 emails
声明 - 用于本地帐户和 Azure AD .
我关注了this guide to make custom policy,所以我在 TrustFrameworkExtensions.xml 文件中添加了一个新的ClaimsProvider
。
当我下载在 Azure 门户中创建的注册和登录策略时,我可以看到以下输出声明:
<OutputClaim ClaimTypeReferenceId="emails" />
我尝试将该行添加到我的自定义策略中,但它没有返回 emails
声明。
有什么想法吗?
【问题讨论】:
在将电子邮件地址放入令牌之前,您尝试从哪里获取电子邮件地址?它是一个 Rest API,还是只是一个本地帐户登录?如果您有新的技术资料,那么最好在问题中添加它。否则,请提及入门包和您的场景。 这个帖子不行,this 一个可以。 【参考方案1】:我采取了更简单的方法,只是在 SignInSignUp.xml 中添加了以下输出声明(我保留了现有的 email 输出声明,无论如何都会被填充仅用于社交登录)
<OutputClaim ClaimTypeReferenceId="signInNames.emailAddress" PartnerClaimType="email" />
【讨论】:
这对我没有任何作用,还有更多要补充的吗? 这适用于谷歌、脸书。但苹果将电子邮件声明作为电子邮件发送。【参考方案2】:我也找不到这个答案 - 看起来“电子邮件”声明是由自定义 OutputClaimsTransformation 返回的,其配置在示例中不可用。
我确实在 SO 上找到了这个答案,这有帮助,但它涵盖了为新用户更新的“otherMails”声明,并且我的现有用户使用了我无法以这种方式更新的基本政策。
似乎通过连接“otherMails”(在社交注册的情况下)与“signInNames”数组中的第一个条目来填充电子邮件。
我最终执行了以下操作来动态创建“电子邮件”声明。
在 TrustFrameworkExtensions.xml 中创建两个新的 ClaimType
<ClaimType Id="emails">
<DisplayName>Emails</DisplayName>
<DataType>stringCollection</DataType>
<UserHelpText>User's email addresses</UserHelpText>
</ClaimType>
<ClaimType Id="firstOtherMail">
<DisplayName>First Other mail</DisplayName>
<DataType>string</DataType>
<UserHelpText>Other Mail</UserHelpText>
</ClaimType>
在 TrustFrameworkExtensions.xml 中创建 3 个新的 ClaimsTransformations
<ClaimsTransformation Id="GetFirstOtherMail" TransformationMethod="GetSingleItemFromStringCollection">
<InputClaims>
<InputClaim ClaimTypeReferenceId="otherMails" TransformationClaimType="collection" />
</InputClaims>
<OutputClaims>
<OutputClaim ClaimTypeReferenceId="firstOtherMail" TransformationClaimType="extractedItem" />
</OutputClaims>
</ClaimsTransformation>
<ClaimsTransformation Id="CopyFirstOtherMailToEmail" TransformationMethod="AddItemToStringCollection">
<InputClaims>
<InputClaim ClaimTypeReferenceId="firstOtherMail" TransformationClaimType="item" />
<InputClaim ClaimTypeReferenceId="emails" TransformationClaimType="collection" />
</InputClaims>
<OutputClaims>
<OutputClaim ClaimTypeReferenceId="emails" TransformationClaimType="collection" />
</OutputClaims>
</ClaimsTransformation>
<ClaimsTransformation Id="CopySignInNamesEmailToEmails" TransformationMethod="AddItemToStringCollection">
<InputClaims>
<InputClaim ClaimTypeReferenceId="signInNames.emailAddress" TransformationClaimType="item" />
<InputClaim ClaimTypeReferenceId="emails" TransformationClaimType="collection" />
</InputClaims>
<OutputClaims>
<OutputClaim ClaimTypeReferenceId="emails" TransformationClaimType="collection" />
</OutputClaims>
</ClaimsTransformation>
在 TrustFrameworkExtensions.xml 中创建一个新的 TechnicalProfile:
<!-- The following technical profile is used to create the emails collection after user authenticates. -->
<TechnicalProfile Id="AAD-UserCreateEmailsClaim">
<Metadata>
<Item Key="Operation">Read</Item>
<Item Key="RaiseErrorIfClaimsPrincipalDoesNotExist">true</Item>
</Metadata>
<IncludeInSso>false</IncludeInSso>
<InputClaims>
<InputClaim ClaimTypeReferenceId="objectId" Required="true" />
</InputClaims>
<OutputClaims>
<OutputClaim ClaimTypeReferenceId="emails" />
</OutputClaims>
<OutputClaimsTransformations>
<OutputClaimsTransformation ReferenceId="GetFirstOtherMail"/>
<OutputClaimsTransformation ReferenceId="CopySignInNamesEmailToEmails"/>
<OutputClaimsTransformation ReferenceId="CopyFirstOtherMailToEmail"/>
</OutputClaimsTransformations>
<IncludeTechnicalProfile ReferenceId="AAD-Common" />
</TechnicalProfile>
在 SignUpOrSignIn 的最后一步 (SendClaims) 之前向 SignUpOrSignIn UserJourney 添加一个新的 OrchestrationStep
<OrchestrationStep Order="8" Type="ClaimsExchange">
<ClaimsExchanges>
<!-- create the emails claim combining signInNames and otherMails -->
<ClaimsExchange Id="AADUserCreateEmailsClaim" TechnicalProfileReferenceId="AAD-UserCreateEmailsClaim" />
</ClaimsExchanges>
</OrchestrationStep>
<OrchestrationStep Order="9" Type="SendClaims" CpimIssuerTechnicalProfileReferenceId="JwtIssuer" />
编辑 PolicyProfile TechnicalProfile 并添加 OutputClaim:
<OutputClaim ClaimTypeReferenceId="emails" />
【讨论】:
你是一个救生员! Policy "..." of tenant "..." 引用了 ID 为 "firstOtherMail" 的 ClaimType 但该策略及其任何基本策略均不包含此类元素...跨度> 抱歉,我错过了那个 - 请参阅修改后的答案。 @RNDThoughts 这不适用于多租户 Azure Active Directory 与 B2C 的集成。你知道为什么吗? @RNDThoughts 感谢您提供清晰准确的答案。就我而言,SignInSignUp.xml 自定义策略在上传时抛出错误。实际上,用户对象中不存在“电子邮件”声明。因此,按照以下方式更新技术配置文件:***.com/questions/56194593/… 帮助了我以上是关于Azure AD B2C - 自定义策略中的“电子邮件”声明的主要内容,如果未能解决你的问题,请参考以下文章
在 Azure AD 中创建用户之前,是不是可以使用 Azure B2C 自定义策略验证来自社交身份提供商 (iDP) 的电子邮件声明?
Azure AD B2C - 我们可以使用电子邮件 ID 而不是 UPN 登录 - 仅限本地帐户自定义策略吗?
如何在 Azure AD B2C 中将电子邮件验证码更改为验证电子邮件的链接