AD组筛选异常:含Admin的组无法匹配及System.NullReferenceException排查
问题原因分析
- 空引用异常根源:
TransitiveMemberOf返回的是全类型目录对象(用户、组、设备等都包含),并非只有组。你把这些对象全部转成AzureADGroupInfo时,非组对象的DisplayName大概率是null,调用Contains("Admin")直接触发空引用异常。 - 筛选结果为空的原因:
- 非组对象被强行转成
AzureADGroupInfo,导致集合里混了一堆无效数据,干扰筛选逻辑。 - 序列化再反序列化的操作会丢失Graph API返回对象的类型信息,没法精准识别真正的组,可能直接把目标组的信息搞乱了。
- 非组对象被强行转成
修复方案
1. 先筛出真正的Group对象
利用Graph API返回对象的类型,用OfType<Group>直接过滤出组:
// 调用Graph API拿所有传递成员身份对象 var directoryObjects = await graphClient.Me.TransitiveMemberOf .Request() .Header("ConsistencyLevel", "eventual") .GetAsync(); // 只保留Group类型的对象 var groups = directoryObjects.OfType<Group>();
2. 手动映射到自定义类型,别用序列化绕弯
直接把Graph的Group对象属性映射到你的AzureADGroupInfo,避免类型不匹配:
IEnumerable<AzureADGroupInfo> allADGroups = groups.Select(g => new AzureADGroupInfo { DisplayName = g.DisplayName, // 其他需要的属性比如Id、Description也在这里映射 });
3. 筛选时先判空,避免异常
在筛选前先检查DisplayName不为空,再执行包含判断:
IEnumerable<AzureADGroupInfo> relevantADGroups = allADGroups .Where(t => !string.IsNullOrEmpty(t.DisplayName) && t.DisplayName.Contains("Admin"));
完整修复代码
// Makes a call to Microsoft Graph var directoryObjects = await graphClient.Me.TransitiveMemberOf .Request() .Header("ConsistencyLevel", "eventual") .GetAsync(); // 筛选组并映射到自定义类型 IEnumerable<AzureADGroupInfo> allADGroups = directoryObjects.OfType<Group>() .Select(g => new AzureADGroupInfo { DisplayName = g.DisplayName, // 补充其他属性映射 }); // 安全筛选目标组 IEnumerable<AzureADGroupInfo> relevantADGroups = allADGroups .Where(t => !string.IsNullOrEmpty(t.DisplayName) && t.DisplayName.Contains("Admin")); this.SetUserCompany(relevantADGroups);
额外提醒
Graph API默认分页返回结果,如果你的组数量超过一页(一般是200条),要处理分页才能拿到所有组:
var allDirectoryObjects = new List<DirectoryObject>(); var page = await graphClient.Me.TransitiveMemberOf .Request() .Header("ConsistencyLevel", "eventual") .GetAsync(); allDirectoryObjects.AddRange(page); while (page.NextPageRequest != null) { page = await page.NextPageRequest.GetAsync(); allDirectoryObjects.AddRange(page); } var groups = allDirectoryObjects.OfType<Group>();
内容的提问来源于stack exchange,提问作者DonDavid12
相关产品推荐
相关产品推荐

