如何使用 .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 关键字,如 Select
或 Filter
。
请注意,我不想只调用 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
过滤。
我知道如何使用下面的其余查询按类型过滤成员目录角色:
https://graph.microsoft.com/v1.0/me/memberOf/$/microsoft.graph.directoryRole
因此来自 MS Graph api 的响应仅包含 directoryRole
个对象。不确定如何使用 MS Graph .Net 客户端 SDK 完成此操作,因为我们没有在实际的 Rest 请求中指定任何 OData 关键字,如 Select
或 Filter
。
请注意,我不想只调用 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的结果:
如果解决方法仍然不能满足您的要求,我建议您在 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
过滤。