使用 Microsoft Graph 客户端库访问 user.MemberOf

Access user.MemberOf with Microsoft Graph Client Library

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

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

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

其结果被提供给一个方法,该方法可能会使用 returned "NextPageRequest" 对象来获取当前页面以外的结果。我们的虚假开发用户帐户以及早期的真实用户从来没有足够的组成员资格来要求 NextPageRequest 逻辑,因此忘记了对其进行测试。

在获得拥有 20 多个组的用户后,最终清楚地表明,如上所述发出请求 return 一页的会员资格,但不会 return 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();

就我们所见,return这是用户的所有组成员身份。如果意图是 Expand 不与 "memberOf" 一起使用,那么它根本不应该工作。现在,旧代码对租户中 800 名用户中的大约 760 名运行良好,其余的是编写支票的用户:)。如果我们做的 .Expand("memberOf") 不正确,请告诉我。

此外,GetMemberGroups 的工作方式与 MemberOf 不同。意图何在?也许做类似 GetMemberGroups(securityEnabledOnly = false, expandGroupInfo = false) 的事情可能会更清楚。

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

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

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

希望这对您有所帮助,

看了一些之后,我找到了 returns 用户的所有组的答案。

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;
    }