使用 Graph SDK 过滤用户的传递组成员身份

Filtering the transitive group memberships of a user using Graph SDK

我正在尝试使用适用于 C# 的 MS Graph SDK(测试版)来获取用户所属的所有组,并使用过滤器仅获取“安全组”。

我的代码如下所示:

var upn = "some.body@org.com";
 
var request = await _graphClient.Users[upn].TransitiveMemberOf
    .Request()
    .Filter("securityEnabled eq true")
    .GetAsync();

当我运行这段代码时,我得到一个错误The specified filter to the reference property query is currently not supported。我知道使用具有相同过滤器的 Postman 可以成功调用相同的 API 端点 所以我假设我的 C# 代码中遗漏了一些东西?

请使用以下代码使用 graph sdk 在 c# 中过滤 securityEnabled

try
        {
            

            List<Option> requestOptions = new List<Option>();

            requestOptions.Add(new QueryOption("$count", "true"));

        

            var request = await graphClient.Users["sruthi@xx.live"].TransitiveMemberOf
                .Request(requestOptions).Header("ConsistencyLevel", "eventual")
                .Filter("securityEnabled eq true")
                .GetAsync();

            Console.WriteLine(JsonConvert.SerializeObject(request));
        }
        catch(Exception e)
        {
            Console.WriteLine(e.Message);
        }

多亏了 Sruthi 的回答,我才能够获得用户可传递的成员资格。显然,这通常会产生一个巨大的列表,而图表 API 只会为您提供分页响应,因此您必须循环浏览每一页才能获得所有内容。

这就是代码现在的样子:

public async Task<List<Group>> ListTransitiveGroupMembershipsOfUserAsync(string upn)
        {
            var requestOptions = new List<Option>
            {
                new QueryOption("$count", "true")
            };

            var directoryObjects = new List<DirectoryObject>();

            var request = await _graphClient.Users[upn].TransitiveMemberOf
                .Request(requestOptions).Header("ConsistencyLevel", "eventual")
                .Filter("securityEnabled eq true")
                .GetAsync();

            directoryObjects.AddRange(request.CurrentPage);

            while (request.NextPageRequest != null)
            {
                var currentHeaders = request.NextPageRequest.Headers;
                IUserTransitiveMemberOfCollectionWithReferencesPage newPage;

                if (!currentHeaders.Any())
                    request = await request.NextPageRequest.Header("ConsistencyLevel", "eventual").GetAsync();
                else
                    request = await request.NextPageRequest.GetAsync();

                directoryObjects.AddRange(request.CurrentPage);
            }

            return directoryObjects.Cast<Group>().ToList();
        }

最初,我的代码在尝试获取第 2 页以后的结果时失败了,因为它一直将 eventual 附加到 ConsistencyLevel header。因此,当发送第 2 页的 HTTP 请求时,header 类似于:第 3 页的 ConsistencyLevel: eventual, eventualConsistencyLevel: eventual, eventual, eventual,依此类推。

为了解决这个问题,我添加了小 if (!currentHeaders.Any()) 块以仅添加 ConsistencyLevel header(如果它尚不存在)。

希望这能帮助那些因循环浏览分页回复而被抓到的人!