首页 > 解决方案 > 如何在 Microsoft Graph API 中筛选 appRoleAssignments

问题描述

我在我们的 Azure AD 租户中有一个企业应用程序,我想检查一个特定的组是否分配给这个应用程序。

要列出应用程序的所有 appRoleAssignments,我可以这样做:

GET /beta/servicePrincipals/{id}/appRoleAssignments

{id}企业应用程序的 ID 在哪里。这将返回appRoleAssignment对象的列表。我想在特定组中过滤此列表,因为该列表可能非常大。我曾尝试使用$filter查询参数,但似乎无法使其正常工作。我尝试了以下方法:

$filter=principalId eq '{groupId}'

这是行不通的。我收到此错误消息:

{
    "error": {
        "code": "BadRequest",
        "message": "Invalid filter clause",
        "innerError": {
            "request-id": "<id>",
            "date": "<date>"
        }
    }
}

有什么方法可以过滤列表吗?

通过执行以下请求,我可以通过获取分配给该组的所有 appRoleAssignments 来潜在地执行此操作:

GET /beta/groups/{groupId}/appRoleAssignments

但我似乎在这里遇到了同样的问题,没有办法用来$filter过滤我想要检查的特定企业应用程序。

如果过滤不起作用,我可以使用任何其他端点,这样我就不必在客户端进行分页了吗?

标签: microsoft-graph-api

解决方案


是的,这是可能的。

这里的混淆是由于在 Microsoft Graph beta 中,实体的principalIdresourceId属性被声明为,而不是更熟悉的.AppRoleAssignmentEdm.GuidEdm.String

使用 Microsoft Graph 测试版

要使用 Microsoft Graph API(使用换行符以确保易读性)检索给定组的所有应用角色分配到给定资源应用:

GET https://graph.microsoft.com/beta/groups/{group-id}/appRoleAssignments
        ?$filter=resourceId eq {resource-id}

在哪里:

  • {group-id}是组的对象 ID
  • {resource-id}是资源应用的服务主体对象 ID

重要提示':注意周围没有单引号 ( ) {resource-id}。当被过滤的属性是 type 时,这是必需的Edm.Guid

使用示例值,此查询如下所示:

GET https://graph.microsoft.com/beta/groups/75c647eb-8ff0-478d-b131-6c1bd4071841/appRoleAssignments
        ?$filter=resourceId eq ddd57b26-e13e-4db4-93d3-996f382251df

我还想借此机会澄清我在问题中注意到的可能的混淆。使用 Microsoft Graph 测试版:

  • 用户、组和服务主体上的appRoleAssignments导航将返回已授予用户、组或服务主体的应用角色分配(即,用户/组/服务主体是principalId返回的AppRoleAssignment)。
  • 服务主体上的appRoleAssignedTo导航将返回应用程序角色分配,其中所讨论的服务主体是公开应用程序角色的资源应用程序(即服务主体是resourceId返回的AppRoleAssignment)。

使用 Azure AD 图形 1.6

注意:通常,建议使用 Microsoft Graph。如果该功能在 Microsoft Graph v1.0 上不可用并且您需要生产就绪 API,则仅使用 Azure AD Graph。您应该计划在 v1.0 中提供该功能后立即迁移到 Microsoft Graph。

要使用 Azure AD Graph API(为易读而使用换行符)检索给定组的所有应用角色分配给给定资源应用:

GET https://graph.windows.net/{tenant-id}/groups/{group-id}/appRoleAssignments
        ?$filter=resourceId eq guid'{resource-sp-id}'
        &api-version=1.6

在哪里:

  • {tenant-id}是租户 ID 还是经过验证的域名
  • {group-id}是组的对象 ID
  • {resource-sp-id}是资源应用的服务主体对象 ID

推荐阅读