我正在寻找一种方法,将emails
声明(电子邮件集合)添加到Azure AD B2C的自定义策略中。此应用程序声明可直接从Azure门户获得,但我找不到在我需要创建的自定义策略中实现此方法的方法。
我想要实现的是为我的WebApp用户提供Azure AD B2C身份验证,为员工提供Azure AD身份验证作为自定义身份验证提供程序,这意味着我需要为本地帐户添加emails
两次声明, Azure AD。
我关注了this guide to make custom policy,因此我在TrustFrameworkExtensions.xml文件中添加了新的ClaimsProvider
。
当我下载Sign Up&登录在Azure门户中创建的策略然后我可以看到以下输出声明:
<OutputClaim ClaimTypeReferenceId="emails" />
我尝试将该行添加到我的自定义政策中,但它不会返回emails
声明。
有什么想法吗?
答案 0 :(得分:5)
我无法找到答案 - 它看起来像是电子邮件&#34;声明由CustomClaimsTransformation返回,其配置在样本中不可用。
我确实在SO上找到了这个有帮助的答案,但它涵盖了更新了&#34; otherMails&#34;对新用户提出索赔,并且我有基本政策的现有用户,我无法以这种方式更新。
似乎通过连接&#34; otherMails&#34;来填充电子邮件。 (在社交注册的情况下)&#34; signInNames&#34;阵列。
我最终做了以下事情来获取&#34;电子邮件&#34;声称动态创建。
在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" />
答案 1 :(得分:5)
我采取了一条简单得多的方法,并在 SignInSignUp.xml 中添加了以下输出声明(我将现有的 email 输出声明留在其中,无论如何都会填充仅用于社交登录)
<OutputClaim ClaimTypeReferenceId="signInNames.emailAddress" PartnerClaimType="email" />