Azure Ad b2c: 成功登录Azure Ad b2c后,在声明中获取电子邮件

6

我正在使用定制策略的入门套装,其中包括SocialAndLocalAccounts套装。

它对我来说工作得很好。

但是我面临一个问题。我需要在成功登录后将电子邮件作为声明获取。当用户已注册并立即重定向回应用程序时,我会收到电子邮件作为声明。

但是当用户仅登录时,我无法获得电子邮件。

我该怎么办?在哪里编写输出声明以获取声明中的电子邮件值?

请帮帮我,谢谢。

4个回答

13

对于 Chris Padgett 的回答,您可以将其他电子邮件(备用电子邮件)添加到声明中。

如果您只想将登录名的电子邮件声明添加到令牌中,只需要执行以下步骤:

  1. 打开您的 SignUporSignIn.xml 文件

  2. <OutputClaim ClaimTypeReferenceId="email" /> 替换为 <OutputClaim ClaimTypeReferenceId="signInNames.emailAddress" PartnerClaimType="email" />

  3. 保存此 SignUporSignIn.xml 文件并上传到 Azure AD B2C 以覆盖该策略。

  4. 运行 SignUporSignIn 策略进行测试。 这是我的测试结果,您可以在令牌中看到电子邮件声明: enter image description here

希望这可以帮助您。


太好了,但这不适用于密码重置策略。我最终也成功实现了重置策略,方法是除了添加你提到的同样的 OutputClaim,还把UserJourney SignUpOrSignIn中的 OrchestrationStep 3 添加到TrustFrameworkBase.xml中的PasswordReset UserJourney中。 - user12861

7
以下描述了如何在注册/登录和密码重置策略中保存、加载并发出“otherMails”声明作为“emails”的方法。
在编写本地帐户时:您必须使用“CreateOtherMailsFromEmail”声明转换从“email”声明创建“otherMails”声明,然后将“otherMails”声明持久化到“AAD-UserWriteUsingLogonEmail”技术配置文件中。
<TechnicalProfile Id="AAD-UserWriteUsingLogonEmail">
  ...
  <IncludeInSso>false</IncludeInSso>
  <InputClaimsTransformations>
    <InputClaimsTransformation ReferenceId="CreateOtherMailsFromEmail" />
  </InputClaimsTransformations>
  <InputClaims>
    ...
  </InputClaims>
  <PersistedClaims>
    ...
    <PersistedClaim ClaimTypeReferenceId="otherMails" />
  </PersistedClaims>
  <OutputClaims>
    ...
    <OutputClaim ClaimTypeReferenceId="otherMails" />
  </OutputClaims>
  ...
</TechnicalProfile>

您必须通过调用用于注册本地帐户的LocalAccountSignUpWithLogonEmail技术配置文件,从中传递otherMails声明:
<TechnicalProfile Id="LocalAccountSignUpWithLogonEmail">
    ...
    <OutputClaims>
        ...
        <OutputClaim ClaimTypeReferenceId="otherMails" />
    </OutputClaims>
</TechnicalProfile>

在编写社交账户时:已经从电子邮件声明中创建了“otherMails”声明,然后将其持久化在“AAD-UserWriteUsingAlternativeSecurityId”技术配置文件中。
然后,您必须从用于注册社交账户的“SelfAsserted-Social”技术配置文件中传递“otherMails”声明。
<TechnicalProfile Id="SelfAsserted-Social">
    ...
    <OutputClaims>
        ...
        <OutputClaim ClaimTypeReferenceId="otherMails" />
    </OutputClaims>
</TechnicalProfile>

阅读本地或社交账户时:在 AAD-UserReadUsingObjectIdAAD-UserReadUsingEmailAddressAAD-UserReadUsingAlternativeSecurityId 技术配置文件中已经读取了 otherMails 声明。
然后,您必须从调用以恢复本地密码的 LocalAccountDiscoveryUsingEmailAddress 技术配置文件中传递 otherMails 声明。
<TechnicalProfile Id="LocalAccountDiscoveryUsingEmailAddress">
    ...
    <OutputClaims>
        ...
        <OutputClaim ClaimTypeReferenceId="otherMails" />
    </OutputClaims>
</TechnicalProfile>

将“otherMails”声明作为注册/登录和重置密码策略中的“emails”发出:您必须将“otherMails”声明添加为依赖方策略的。
<RelyingParty>
    ...
    <TechnicalProfile Id="PolicyProfile">
        <OutputClaims>
            ...
            <OutputClaim ClaimTypeReferenceId="otherMails" PartnerClaimType="emails" />
        </OutputClaims>
    </TechnicalProfile>
</RelyingParty>

2
你真是太棒了。谢谢! - Tejinder Singh
7
我遇到了和原贴作者一样的问题。但是读完这篇回复后,我只能说“什么鬼”...虽然也许会导致成功,但这就是我对配置地狱和完全混乱的“框架”的理解。(发泄结束) - thmshd
1
@chris-pagett 如果我们使用自定义策略进行注册并使用用户名进行登录,我们如何获取电子邮件? - anomepani

5
另一个对我有效的选择是扩展 AAD-UserReadUsingObjectId,使其将signInNames.emailAddress声明复制到email中。这使得登录与我们的其他整合注册、密码重置和社交登录的流程保持一致--在第一次登录/注册期间,每个流程都填充了email
我所需要做的就是将此代码添加到TrustFrameworkExtension.xml(在<ClaimsProviders>下)。
    <ClaimsProvider>
      <DisplayName>Azure Active Directory</DisplayName>

      <TechnicalProfiles>
        <TechnicalProfile Id="AAD-UserReadUsingObjectId">
          <OutputClaims>
            <OutputClaim 
              ClaimTypeReferenceId="email"
              PartnerClaimType="signInNames.emailAddress"
            />
          </OutputClaims>
        </TechnicalProfile>
      </TechnicalProfiles>
    </ClaimsProvider>

2
这是一个更好的答案,因为它为所有旅程添加了电子邮件...而不仅仅是SignUpSignIn。此外,如果您将社交/AAD登录与本地帐户组合使用,则SignUpSignIn不会包含多个“电子邮件”声明条目(这很令人困惑,因为只有一个将根据登录方法填充)。 - SoonGuy

0
你需要针对电子邮件输出分别考虑本地账户和社交账户,因为B2C将这些与电子邮件相关的属性存储方式不同。以下是我提出的解决方案:
1. 对于本地账户,将其添加到AAD-UserReadUsingObjectId TP中,例如:
  <TechnicalProfiles>
    <TechnicalProfile Id="AAD-UserReadUsingObjectId">
      <OutputClaims>
        <OutputClaim ClaimTypeReferenceId="email" PartnerClaimType="signInNames.emailAddress"/>
      </OutputClaims>
    </TechnicalProfile>
  </TechnicalProfiles>
</ClaimsProvider>

对于社交账户,添加一个claimstransformation TP来额外的索赔交换用户流程步骤,将电子邮件添加到索赔包中。
例如:
<ClaimsTransformation Id="CreateEmailFromOtherMails" TransformationMethod="GetSingleItemFromStringCollection"> <InputClaims> <InputClaim ClaimTypeReferenceId="otherMails" TransformationClaimType="collection" /> </InputClaims> <OutputClaims>
 <OutputClaim ClaimTypeReferenceId="email" TransformationClaimType="extractedItem" /> </OutputClaims </ClaimsTransformation>

https://learn.microsoft.com/en-us/azure/active-directory-b2c/stringcollection-transformations#example-of-getsingleitemfromstringcollection


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接