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

Tej*_*ngh 3 azure azure-ad-b2c

我正在将自定义策略的入门包与SocialAndLocalAccounts包一起使用。

对我来说很好。

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

但是当用户只是登录时我没有收到。

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

请帮助我。谢谢

Chr*_*ett 6

下面介绍了如何保存、加载,然后将otherMails声明作为来自注册/登录和密码重置策略的电子邮件发出。

编写本地帐户时:您必须使用CreateOtherMailsFromEmail声明转换从电子邮件声明创建otherMails声明,然后在AAD-UserWriteUsingLogonEmail技术配置文件中保留otherMails声明:

<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>
Run Code Online (Sandbox Code Playgroud)

然后,您必须从LocalAccountSignUpWithLogonEmail技术配置文件中传递otherMails声明,该技术配置文件被调用以注册本地帐户:

<TechnicalProfile Id="LocalAccountSignUpWithLogonEmail">
    ...
    <OutputClaims>
        ...
        <OutputClaim ClaimTypeReferenceId="otherMails" />
    </OutputClaims>
</TechnicalProfile>
Run Code Online (Sandbox Code Playgroud)

编写社交帐户时:otherMails声明已根据电子邮件声明创建,然后保留在AAD-UserWriteUsingAlternativeSecurityId技术配置文件中。

然后,您必须从SelfAsserted-Social技术配置文件中传递otherMails声明,该配置文件被调用以注册社交帐户:

<TechnicalProfile Id="SelfAsserted-Social">
    ...
    <OutputClaims>
        ...
        <OutputClaim ClaimTypeReferenceId="otherMails" />
    </OutputClaims>
</TechnicalProfile>
Run Code Online (Sandbox Code Playgroud)

读取本地或社交帐户时:otherMails声明已在AAD-UserReadUsingObjectId、AAD-UserReadUsingEmailAddress和AAD-UserReadUsingAlternativeSecurityId技术配置文件中读取。

然后,您必须从LocalAccountDiscoveryUsingEmailAddress技术配置文件中传递otherMails声明,该技术配置文件被调用以恢复本地密码:

<TechnicalProfile Id="LocalAccountDiscoveryUsingEmailAddress">
    ...
    <OutputClaims>
        ...
        <OutputClaim ClaimTypeReferenceId="otherMails" />
    </OutputClaims>
</TechnicalProfile>
Run Code Online (Sandbox Code Playgroud)

要将otherMails声明作为来自注册/登录和密码重置策略的电子邮件发出:您必须将otherMails声明添加<OutputClaim />到依赖方策略:

<RelyingParty>
    ...
    <TechnicalProfile Id="PolicyProfile">
        <OutputClaims>
            ...
            <OutputClaim ClaimTypeReferenceId="otherMails" PartnerClaimType="emails" />
        </OutputClaims>
    </TechnicalProfile>
</RelyingParty>
Run Code Online (Sandbox Code Playgroud)

  • 我遇到了与 OP 相同的问题。但是,阅读此回复,我就像 **_WTF?_**...即使可能会导致成功,这也是我对配置地狱和完全搞砸的“框架”的理解。(吐槽) (4认同)
  • 你真棒。谢谢 (2认同)

Way*_*ang 5

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

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

  1. 打开你的SignUporSignIn.xml文件

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

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

  4. 运行SignUporSignIn策略进行测试。这是我的测试结果,您可以在令牌中看到电子邮件声明: 在此处输入图片说明

希望这可以帮助。


Guy*_*ock 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>
Run Code Online (Sandbox Code Playgroud)

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