You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过MS Graph API获取Azure AD B2C用户真实UserPrincipalName

问题原因

Azure AD B2C 租户的本地用户存在默认属性处理逻辑:如果你创建用户时设置的登录标识后缀不属于该租户已验证的域名(比如填入的gmail.com后缀不属于自有B2C租户),系统不会将你填入的值写入userPrincipalName属性,而是自动将userPrincipalName覆写为「用户Object ID + 租户默认onmicrosoft.com域名」的格式,你创建时填入的形如my-user@gmail.com的登录标识,实际存储在用户对象的identities属性中。

获取原始登录标识的方法

identities属性不会在调用Graph用户接口时默认返回,需要手动在请求中通过$select参数指定返回该字段:

单用户查询请求示例

GET https://graph.microsoft.com/v1.0/users/{替换为目标用户的object id}?$select=id,displayName,userPrincipalName,identities

返回值解析

接口返回的identities是数组结构,找到signInType为emailAddress的条目,对应的issuerAssignedId字段值就是你创建用户时设置的原始邮箱登录值:

{
  "id": "12345678-abcd-efgh-12345678910a",
  "displayName": "unknown",
  "userPrincipalName": "12345678-abcd-efgh-12345678910a@mydomain.onmicrosoft.com",
  "identities": [
    {
      "signInType": "emailAddress",
      "issuer": "mydomain.onmicrosoft.com",
      "issuerAssignedId": "my-user@gmail.com"
    },
    {
      "signInType": "userPrincipalName",
      "issuer": "mydomain.onmicrosoft.com",
      "issuerAssignedId": "12345678-abcd-efgh-12345678910a@mydomain.onmicrosoft.com"
    }
  ]
}

批量查询所有用户原始登录标识的请求示例

GET https://graph.microsoft.com/v1.0/users?$select=id,displayName,identities&$filter=identities/any(i:i/signInType eq 'emailAddress')
注意事项
  • 调用上述接口需要为调用方授予User.Read.All(只读)或User.ReadWrite.All(读写)权限,否则无权限读取identities属性。
  • 不要在B2C场景下依赖userPrincipalName属性存储/读取用户的真实登录账号,该字段仅用于租户内部的Azure AD体系标识,不代表用户实际使用的登录名。
  • 仅当创建用户时使用的登录标识后缀为租户已验证的自定义域名时,userPrincipalName才会保留你创建时填入的原始值。

内容的提问来源于stack exchange,提问作者Will

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 14:15:37