validation - 在 Azure AD 中创建用户之前,是否可以使用 Azure B2C 自定义策略验证来自社交身份提供商 (iDP) 的电子邮件声明?
问题描述
场景是这样的:我们已将 Microsoft iDP 添加到我们的应用程序中。用户可以单击 Microsoft 帐户按钮并使用其 MSA 帐户进行注册\登录。
当用户注册时,我们希望根据我们的数据库验证电子邮件。如果用户的电子邮件在我们的数据库中,让他们继续注册;否则我们想阻止他们注册并显示错误消息。这将阻止在我们的 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 门户中登录。但是,无论我做什么,我都看不到trace
来自我编写的 REST API 验证方法的日志,也没有调用REST-ValidateEmail
. 看起来它根本没有被调用。
从这个评论:
这个从我的自定义策略调用外部 API 的技巧不起作用,因为我们无法拦截来自社交媒体的登录\注册调用。我尝试创建一个 REST API,它将电子邮件作为我的自定义策略(TrustFrameworkExtensions)中的输入声明,并进一步点击 Graph API 以检查此电子邮件是否存在于 B2C 中,仅适用于本地帐户,不适用于社交媒体帐户。
如果这是真的,我试图让这种情况发挥作用的尝试将不会蓬勃发展。
这个评论成立吗?如果是,在使用 3rd 方 iDP 时,是否有其他方法可以拦截登录\注册操作?
注1:
探索更多TrustFrameworkBase.xml
文件,我看到了这个技术简介SelfAsserted-Social
。我想我将不得不使用它而不是LocalAccountSignUpWithLogonEmail
.
解决方案
是的,我在上面的问题中添加的注 1是要走的路。
刚刚使用SelfAsserted-Social
技术配置文件而不是LocalAccountSignUpWithLogonEmail
.
它起作用了,其余的 API 被按预期调用。我可以在应用服务的日志流中看到跟踪和尝试的电子邮件。
提供无效电子邮件时,用户可以看到从自定义验证端点返回的错误消息。
这是被覆盖\补充的技术配置文件TrustFrameworkExtensions.xml
:
<ClaimsProvider>
<DisplayName>Self Asserted</DisplayName>
<TechnicalProfiles>
<TechnicalProfile Id="SelfAsserted-Social">
<ValidationTechnicalProfiles>
<ValidationTechnicalProfile ReferenceId="REST-ValidateEmail" />
</ValidationTechnicalProfiles>
</TechnicalProfile>
</TechnicalProfiles>
</ClaimsProvider>
推荐阅读
- python - 如何将三元素字典列表(第一个元素:术语,第二个元素:位置,第三个:值)转换为二元素字典列表
- python - 在 PostgreSQL 上使用 CTE() 的 SQLAlchemy 查询
- html - CSS - 将 Font Awesome 图标与一段文本对齐
- html - 角度属性无法设置未定义的属性
- angular - 订阅登录组件时登录方法抛出错误。声明类型既不是“void”也不是“any”的函数必须返回一个值
- python - 如何删除单列中的小数?
- python - python seaborn.distplot 不正确的图例
- javascript - NUXT - 加载资源失败:服务器响应状态为 404
- testng - 在构建期间不运行 Testng 测试
- postman - Postman:如何从一个 API 获取响应数据并在另一个 API 中使用它(如果我在一个集合中有两个 API)