如何通过Microsoft Graph SDK获取User的employeeOrgData.division?
解决Microsoft Graph SDK获取employeeOrgData.division字段为null的问题
以下是针对你遇到的问题的具体解决步骤和代码调整建议:
1. 核心问题排查方向
- 确认Graph API版本:
employeeOrgData属于较新的用户属性,需确保使用Microsoft Graph API v1.0及以上版本(SDK默认使用v1.0,若自定义了版本需检查)。 - 验证字段实际值存在性:先通过Graph Explorer调用接口
GET /users?$select=employeeOrgData&filter=employeeType eq 'Employee',确认目标用户的employeeOrgData.division字段是否真的有值。如果接口返回就为空,说明该用户的此属性未在Azure AD中配置,和代码无关。 - 检查权限有效性:确保
User.Read.All权限已完成管理员同意(应用权限场景)或用户授权(委托权限场景),该权限足够读取employeeOrgData字段。
2. 代码调整建议
修改$select参数写法
直接指定employeeOrgData.division可能会导致SDK序列化异常,建议先选中整个employeeOrgData对象,再通过对象属性访问Division:
[AuthorizeForScopes(Scopes = new[] { "User.Read.All" })] public async Task<IActionResult> GridView() { var queryOptions = new List<QueryOption>(); queryOptions.Add(new QueryOption("$count", "true")); queryOptions.Add(new QueryOption("$expand", "manager($levels=1;$select=displayName)")); // 调整$select,选中整个employeeOrgData对象 queryOptions.Add(new QueryOption("$select", "onPremisesSamAccountName,displayName,mail,jobTitle,department,surname,givenName,streetAddress,city,state,postalCode,businessPhones,mobilePhone,employeeOrgData")); var results = await _graphServiceClient.Users .Request(queryOptions) .Header("ConsistencyLevel", "eventual") .Filter("employeeType eq 'Employee'") .GetAsync(); // 修复分页逻辑的冗余添加问题 var users = new List<User>(results.CurrentPage); while (results.NextPageRequest != null) { results = await results.NextPageRequest.GetAsync(); users.AddRange(results.CurrentPage); } // 排序去重 users = users .DistinctBy(u => u.Id) .OrderBy(x => x.Surname) .ThenBy(x => x.GivenName).ToList(); // 访问字段时使用:user.EmployeeOrgData?.Division return View("GridView", users); }
额外优化点
- 更新Microsoft Graph SDK包到最新版本:旧版本的
User实体类可能缺少EmployeeOrgData属性或存在序列化逻辑问题。 - 避免冗余数据:原代码中
users.AddRange(results.CurrentPage.OfType<User>())属于重复添加,已在调整后的代码中移除。
内容的提问来源于stack exchange,提问作者s15199d
相关产品推荐
相关产品推荐

