使用Microsoft Graph Client Library访问user.MemberOf

时间:2016-12-22 14:21:15

标签: c# microsoft-graph

注意:I originally posed this question在客户端库repo中,他们回答说这是服务库中的问题,而不是.NET库。

在开发过程中,我们一直在做这样的事情来获得用户的群体:

var user = await GraphClient.Users[userId].Request().Expand("memberOf").GetAsync();

其结果被用于一种方法,该方法将使用可能返回的" NextPageRequest"对象以获取超出当前页面的结果。我们的虚假开发用户帐户以及早期的真实用户从来没有足够的组成员资格来要求NextPageRequest逻辑,并且对它的测试被遗忘了。

在获得20多个组的用户之后,最终明确表示如上所述提出请求会返回一页的会员资格,但不会返回NextPageRequest以用于后续请求的选项。关于集合的文档使得它看起来应该如何完成。

我确信你已经知道,一种有效的方法是这样的:

List<Group> userGroups = await GraphClient.Users[userId].MemberOf.Request().GetAsync().CurrentPage.Where(p => p.GetType() == typeof(Microsoft.Graph.Group)).Cast<Microsoft.Graph.Group>().ToList();

据我们所见,这将返回所有用户的组成员身份。如果意图是扩展不与&#34; memberOf&#34;一起使用,那么它根本不应该工作。现在,旧代码适用于租户中800个用户中的大约760个,其余的是编写支票的人:)。如果我们错误地执行了.Expand(&#34; memberOf&#34;),请告诉我。

此外,GetMemberGroups的工作方式与MemberOf不同。意图是什么?也许做GetMemberGroups(securityEnabledOnly = false, expandGroupInfo = false)这样的事情可能更清楚。

2 个答案:

答案 0 :(得分:1)

看了一下之后,我找到了一个回答用户返回所有组的答案。

public async Task<List<string>> GetCurrentUserGroups(GraphServiceClient graphClient)
    {
        var totalGroups = new List<string>();
        var groups = await graphClient.Me.MemberOf.Request().GetAsync();

        while (groups.Count > 0)
        {
            foreach (Group g in groups)
            {
                totalGroups.Add(g.DisplayName);
            }
            if (groups.NextPageRequest != null)
            {
                groups = await groups.NextPageRequest.GetAsync();
            }
            else
            {
                break;
            }
        }
        return totalGroups;
    }

答案 1 :(得分:0)

您的观察结果是正确的。 $ expand在目录中有限,并且最多只能扩展到20个项目并且不支持分页。对于其他Graph服务,这不一定如此。请参阅https://graph.microsoft.io/en-us/docs/overview/query_parameters和$ expand,其中记录了这一点。

不幸的是,改变行为以返回$ expand = memberOf之类的不支持的错误将代表一个重大变化。我们可以考虑对新版本进行此更改。

我们还希望为Graph元数据文档添加更多注释,这些注释可能能够描述支持扩展和分页的位置。这也有助于限制客户端库不显示服务无法支持的选项。

希望这有帮助,