在 Azure AD 中创建用户之前,是否可以使用 Azure B2C 自定义策略验证来自社交身份提供商 (iDP) 的电子邮件声明?

Is it possible to validate the Email claim from Social Identity Providers (iDPs) using Azure B2C custom policy before creating a User in Azure AD?

场景是这样的:我们已经将 Microsoft iDP 添加到我们的应用程序中。用户可以单击 Microsoft 帐户按钮并使用他们的 MSA 帐户 sign-up\sign-in.

当用户注册时,我们希望根据我们的数据库验证电子邮件。如果用户的电子邮件在我们的数据库中,让他们继续并注册;否则我们会阻止他们注册并显示错误消息。这将阻止在我们的 Azure B2C AD 中创建用户。

我使用了以下 TechnicalProfile:

<TechnicalProfile Id="REST-ValidateEmail">
      <DisplayName>Validate Membership Email</DisplayName>
      <Protocol Name="Proprietary" 
        Handler="Web.TPEngine.Providers.RestfulProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
      <Metadata>
        <Item Key="ServiceUrl">{Settings:AzureAppServiceUrl}/api/User/ValidateEmail</Item>
        <Item Key="AuthenticationType">None</Item>
        <Item Key="SendClaimsIn">Body</Item>
      </Metadata>
      <InputClaims>
        <InputClaim ClaimTypeReferenceId="email" 
          PartnerClaimType="UserEmail" />
      </InputClaims>
      <UseTechnicalProfileForSessionManagement ReferenceId="SM-Noop" />
</TechnicalProfile>

然后将 REST-ValidateEmail 添加到 LocalAccountSignUpWithLogonEmail 作为验证技术配置文件。

<ClaimsProvider>
      <DisplayName>Local Account</DisplayName>
      <TechnicalProfiles>
        <TechnicalProfile Id="LocalAccountSignUpWithLogonEmail">
          <Metadata>
            <!--Demo: disable the email validation in development environment-->
            <!--Demo action required: remove in production environment-->
            <Item Key="EnforceEmailVerification">False</Item>
          </Metadata>
          <OutputClaims>
            <OutputClaim ClaimTypeReferenceId="extension_MembershipEmail" 
              PartnerClaimType="UserEmail" />
          </OutputClaims>
          <ValidationTechnicalProfiles>
            <ValidationTechnicalProfile ReferenceId="REST-ValidateEmail" />
            <ValidationTechnicalProfile ReferenceId="AAD-UserWriteUsingLogonEmail" />
          </ValidationTechnicalProfiles>
        </TechnicalProfile>
      </TechnicalProfiles>
    </ClaimsProvider>

向自定义策略添加了 Application Insights 调试。我看到 UserJourney(s) 被记录在 Azure 门户中。但是,无论我做什么,我都看不到来自我编写的 REST API 验证方法的 trace 日志,也没有调用 REST-ValidateEmail。看起来它根本没有被调用。

来自this comment

This trick of calling external API from my custom policy didn't work because we can't intercept sign-in\sign-up calls from social media. I tried creating a REST API that will take email as an input claim in my custom policy(TrustFrameworkExtensions) and further hit Graph API to check that this email exists in B2C or not will work only for local accounts and not for social media accounts.

如果这是真的,我使这个场景起作用的尝试就不会成功。

这个评论是否成立?如果是,在与第 3 方 iDP 合作时是否有任何其他方式拦截 Sign-in\Sign-up 操作?

注1:

进一步探索 TrustFrameworkBase.xml 文件,我看到了这个技术简介 SelfAsserted-Social。我想我将不得不使用它而不是 LocalAccountSignUpWithLogonEmail.

是的,注意 1 我在上面的问题中添加的是要走的路。

刚刚使用 SelfAsserted-Social 技术资料而不是 LocalAccountSignUpWithLogonEmail 测试了场景。

它成功了,其余 API 按预期被调用。我可以在应用服务的日志流中看到痕迹和电子邮件尝试。

提供无效电子邮件时,用户能够看到从自定义验证端点返回的错误消息。

这是 TrustFrameworkExtensions.xml 中的 overridden\complemented 技术资料:

<ClaimsProvider>
  <DisplayName>Self Asserted</DisplayName>
  <TechnicalProfiles>

    <TechnicalProfile Id="SelfAsserted-Social">
      <ValidationTechnicalProfiles>
        <ValidationTechnicalProfile ReferenceId="REST-ValidateEmail" />
      </ValidationTechnicalProfiles>
    </TechnicalProfile>

  </TechnicalProfiles>
</ClaimsProvider>