使用Graph SDK筛选用户的传递组成员身份

时间:2020-10-03 23:17:42

标签: c# microsoft-graph-api microsoft-graph-sdks

我正在尝试使用用于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#代码中缺少某些内容吗?

2 个答案:

答案 0 :(得分:1)

请使用下面的代码使用图形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);
        }

答案 1 :(得分:0)

由于Sruthi的回答,我得以获得用户可传递的会员资格。显然,这通常会导致列表庞大,并且Graph 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标头中。因此,在发送第2页的HTTP请求时,标头类似于:第3页的ConsistencyLevel: eventual, eventualConsistencyLevel: eventual, eventual, eventual,依此类推。

要解决此问题,我添加了一个小的if (!currentHeaders.Any())块,以仅添加ConsistencyLevel标头(如果尚不存在)。

希望这会帮助其他任何人都可以通过分页的响应循环而陷入困境!