Azure B2C能否通过声明发送用户主体名称(UPN)并获取用户唯一用户名
最优实现方案:配置B2C用户流返回UPN声明
该方案操作成本最低,无需修改现有注册流程,也不存在唯一性校验的额外开发量,是首选方案:
- 进入Azure B2C管理界面,打开你正在使用的注册/登录用户流配置页
- 左侧导航选择「应用程序声明」选项
- 在声明列表中勾选用户主体名称(User Principal Name),保存配置后等待1~2分钟生效
- 如果你使用的是自定义策略(IEF),直接在对应依赖方配置的输出声明节点中添加
<OutputClaim ClaimTypeReferenceId="upn" PartnerClaimType="upn" />即可
Blazor端获取UPN的代码示例:
// 注入AuthenticationStateProvider后调用 var authState = await _authStateProvider.GetAuthenticationStateAsync(); var userClaims = authState.User.Claims; // 默认UPN的声明类型为固定值 var userName = userClaims.FirstOrDefault(c => c.Type == "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/upn")?.Value;
其他方案适用场景&实现说明
1. 账户创建时将UPN设置为显示名称
仅适合业务上要求显示名称与UPN完全一致的场景,灵活性较低:
- 内置用户流:在注册页面配置中隐藏显示名称输入项,设置默认值为用户主体名称即可
- 自定义策略:在用户创建的技术配置文件中添加声明转换规则,将
upn的值直接赋值给displayName属性
2. 强制显示名称唯一
不推荐,开发成本最高:内置用户流不支持该能力,必须通过自定义策略实现,需要额外开发调用Microsoft Graph校验显示名称是否重复的逻辑,还要配套注册页的错误提示逻辑,工作量是首选方案的数倍。
3. 调用Microsoft Graph查询用户属性
适合需要同时获取UPN之外其他用户属性的场景:
- 用登录后默认返回的用户
objectId声明作为参数,调用Graph API的GET /users/{objectId}接口即可获取包括UPN在内的全量用户属性 - 需要给应用配置Microsoft Graph的
User.Read权限,会多一次API调用开销,性能弱于直接从令牌中取声明
内容的提问来源于stack exchange,提问作者Zami77
相关产品推荐
相关产品推荐

