使用Graph API读取Azure B2C自定义属性遇问题求助
解决方案
1. 先确认自定义属性的正确Graph API名称
Azure B2C里的自定义用户属性,在Graph API里的名称格式是固定的:extension_{b2c-extensions-app的客户端ID(去掉所有横杠)}_{属性名}
- 找到你B2C租户里那个叫
b2c-extensions-app. Do not modify. Used by AADB2C for storing user data.的应用,复制它的客户端ID,然后把里面的所有-删掉 - 比如原客户端ID是
a1b2c3d4-5678-90ef-ghij-klmnopqrstuv,去掉横杠后变成a1b2c3d4567890efghijklmnopqrstuv,那你的IsAdmin属性对应的Graph API名称就是extension_a1b2c3d4567890efghijklmnopqrstuv_IsAdmin
2. 查询单个用户时显式指定要获取的自定义属性
Graph API默认只返回用户的核心属性,自定义扩展属性得通过$select参数明确指定才能拿到,修改你的代码:
var user = await graphClient.Users["{USER-GUID}"] .Request() // 把需要的核心属性和自定义属性列在这里 .Select("id, displayName, extension_<去掉横杠的客户端ID>_IsAdmin") .GetResponseAsync();
3. 筛选用户时的两个关键点
用对属性名称
筛选语句里必须用完整的扩展属性名称,同时别忘了加上$select来返回该属性:
var results = await graphClient.Users .Request() .Select("id, displayName, extension_<去掉横杠的客户端ID>_IsAdmin") .Filter("extension_<去掉横杠的客户端ID>_IsAdmin eq true") .GetAsync();
确保权限足够
你的应用必须拥有Application类型的Directory.Read.All权限,而且已经完成了管理员同意。如果用的是Delegated类型的User.Read.All权限,没法支持扩展属性的筛选操作。
4. 回头验证用户创建时的属性设置
确认你当初用Graph API创建用户时,是用正确的扩展属性名称来设置IsAdmin值的,比如:
var user = new User { AccountEnabled = true, DisplayName = "Admin User", MailNickname = "adminuser", UserPrincipalName = "admin@yourb2ctenant.onmicrosoft.com", PasswordProfile = new PasswordProfile { ForceChangePasswordNextSignIn = false, Password = "YourStrongPassword123!" }, AdditionalData = new Dictionary<string, object> { {"extension_<去掉横杠的客户端ID>_IsAdmin", true} } }; await graphClient.Users .Request() .AddAsync(user);
内容的提问来源于stack exchange,提问作者Stephen H
相关产品推荐
相关产品推荐

