Azure AD B2C为何创建Gmail及自定义OpenID Connect用户?技术咨询
这是Azure AD B2C的默认行为导致的——默认的登录/注册策略(比如SignUpOrSignIn)会在用户通过外部身份提供商(包括你的自定义OIDC服务器或Gmail)首次验证后,自动在B2C的关联目录中创建本地账户,目的是将外部用户的信息同步到B2C侧,方便后续的用户管理操作。但如果你希望完全依赖外部身份提供商认证,不在B2C目录中创建用户,可以通过以下方式调整:
1. 使用「无本地账户」的用户旅程模板
Azure AD B2C提供了专门的SignInWithExternalIdp用户旅程模板,这个模板的核心逻辑是仅验证外部身份提供商的token,不创建本地账户。你可以基于这个模板创建自定义策略,替换原来的SignUpOrSignIn策略:
- 在自定义策略的
UserJourneys节点中,定义一个基于SignInWithExternalIdp的旅程,移除所有涉及本地账户创建的步骤(比如LocalAccountSignUpWithLogonEmail或AAD-UserWriteUsingAlternativeSecurityId)。 - 确保旅程的最终步骤是生成并返回B2C的ID/access token,跳过任何写入用户目录的操作。
2. 调整Technical Profile的Claims映射
在自定义OIDC提供商的Technical Profile配置中,要避免让B2C生成本地的objectId,而是直接使用外部IDP返回的唯一标识(比如sub)作为B2C token中的用户标识:
<OutputClaims> <OutputClaim ClaimTypeReferenceId="sub" PartnerClaimType="sub" /> <OutputClaim ClaimTypeReferenceId="displayName" PartnerClaimType="name" /> <OutputClaim ClaimTypeReferenceId="email" PartnerClaimType="email" /> <!-- 不要包含需要B2C生成的objectId,直接用外部IDP的sub --> </OutputClaims>
这样B2C就不会因为需要生成本地objectId而触发账户创建流程。
3. 移除用户旅程中的账户创建步骤
如果你是基于现有策略修改,需要检查OrchestrationSteps节点,移除所有调用AAD-UserWriteUsingAlternativeSecurityId的步骤——这个Technical Profile的作用就是将外部用户的身份信息写入B2C目录,创建本地关联账户。
- 保留的步骤应该是:身份提供商选择 → 外部IDP验证 → 生成token,中间跳过任何写入用户目录的操作。
4. 针对Gmail等第三方IDP的注意事项
对于Gmail这类预配置的身份提供商,默认的SignUpOrSignIn策略同样会在首次登录时创建本地账户。你需要为Gmail也配置对应的无本地账户旅程,或者在现有策略中移除针对社交账户的写入步骤。如果修改登录策略属性后出现问题,大概率是不小心重新添加了账户创建的步骤,需要重新检查策略配置。
重要提醒
采用无本地账户的流程后,B2C不会存储任何用户信息,所有用户身份数据都依赖外部IDP提供。后续如果需要用户重置密码、修改个人资料等操作,都需要引导用户到对应的外部身份提供商完成,B2C侧无法直接管理这些用户的信息。
内容的提问来源于stack exchange,提问作者Vetrivel mp

