如何使用 .Net Client SDK 从 Microsoft Graph 获取我所属的管理员角色?

How to get admin roles that I am a member of, from Microsoft Graph using .Net Client SDK?

我知道如何使用下面的其余查询按类型过滤成员目录角色:

https://graph.microsoft.com/v1.0/me/memberOf/$/microsoft.graph.directoryRole

因此来自 MS Graph api 的响应仅包含 directoryRole 个对象。不确定如何使用 MS Graph .Net 客户端 SDK 完成此操作,因为我们没有在实际的 Rest 请求中指定任何 OData 关键字,如 SelectFilter

请注意,我不想只调用 memberOf 并在客户端的内存中过滤 directoryRole 类型的响应,我希望此过滤器成为 [=25] 中查询的一部分=] 上面,所以 memberOf 响应只包含 directoryRole s.

Graph Net 客户端没有直接支持您的要求。

但根据我的测试,我们可以尝试以下解决方法:

使用以下代码获取带有 DirectoryRole 的列表,然后通过 DisplayName 进行过滤,然后检查 role 模板 id(对于来自 [= 的 directoryRole 50=],如果DisplayName中包含Administrator,基本上我们就是admin角色。如果使用DirectoryRoles api, 我们可以迭代列表并检查 角色模板 id):

// This will contains the group too, we need to filter it to get the directoryrole

    IUserMemberOfCollectionWithReferencesRequest builder = graphClient.Me.MemberOf.Request();
                    IUserMemberOfCollectionWithReferencesPage page = await builder.GetAsync();

    // This is all directoryrole in our tenant, we need to filter by DisplayName contains **Administrator**
                IGraphServiceDirectoryRolesCollectionRequest request = graphClient.DirectoryRoles.Request();
                IGraphServiceDirectoryRolesCollectionPage directoryRoles = await request.GetAsync();

Me.MemberOf的结果: DirectoryRoles 的结果:

如果解决方法仍然不能满足您的要求,我建议您在 uservoice and github issues

上提交功能请求

补充回答: (不幸的是,Microsoft Graph 中目录资源的过滤通常非常有限。所以您可以使用客户端内存中过滤器或现在提交功能请求):

理论上,我们可以像这样使用其余的api(当前不支持对引用属性查询指定的过滤器。)

https://graph.microsoft.com/v1.0/me/memberOf/$/microsoft.graph.group?$filter=groupTypes/any(a:roleTemplateId eq  '62e90394-69f5-4237-9190-012177145e10')

并且在基于 Graph Client 的 C# 代码中

List<QueryOption> options = new List<QueryOption>
                {
                    new QueryOption("$filter", 
                      "groupTypes/any(a:roleTemplateId eq  '62e90394-69f5-4237-9190-012177145e10'")
                };   
IUserMemberOfCollectionWithReferencesRequest builder = graphClient.Me.MemberOf.Request(options); 

                    IGraphServiceDirectoryRolesCollectionRequest request = graphClient.DirectoryRoles.Request(options);

对于SDK,过滤是一种应用于对象的功能。例如:

var users = await graphClient
    .Users
    .Request()
    .Filter("startswith(displayName,'A')")
    .GetAsync();

很遗憾,这对您没有帮助,因为 /memberOf 不支持 $filter。所以你需要在客户端上进行过滤。

如果您正在检查特定的 directoryRole, you could come at this from the other direction. The /members 端点 是否支持按成员过滤 id:

v1.0/directoryRoles/{role-id}/members?$filter=id eq '{user-id}'

这里需要注意的是 /members 支持 userPrincipalName 过滤,仅支持 id 过滤。