如何通过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
相关产品推荐
相关产品推荐

