【问题标题】:How to filter appRoleAssignments in Microsoft Graph API如何在 Microsoft Graph API 中筛选 appRoleAssignments
【发布时间】:2020-07-31 23:06:57
【问题描述】:

我在我们的 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


    【解决方案1】:

    是的,这是可能的。

    这里的混淆是由于在 Microsoft Graph beta 中,AppRoleAssignment 实体的principalIdresourceId 属性被声明为Edm.Guid,而不是更熟悉的Edm.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} 周围没有单引号 (')。当被过滤的属性是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 导航将返回应用角色分配,其中相关服务主体是公开应用角色的资源应用(即服务主体是返回的AppRoleAssignmentresourceId) .

    使用 Azure AD Graph 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

    【讨论】:

    • 我很确定我在过滤子句中也尝试过不使用引号,但显然没有。谢谢!我也有点困惑$filter eq ' ... ' 并不总是适用于文档所说的字符串属性,但我猜这是一个不同的问题。
    • 并非所有属性都可以过滤。 可以过滤的字符串需要使用单引号。 Guid 要求省略单引号。
    • 文档中是否有任何地方说明可以过滤哪些属性?或者也许在一个模式中?
    • 今天,这应该包含在每种资源类型的 API 文档中。 (例如,'Supports $filter in user properties list。如果您没有看到该资源类型,您可以在文档页面底部打开一个问题。)不幸的是,此信息(尚未)包含在元数据中注释(FilterRestrictions 注释说明实体是否可过滤,但没有详细说明哪些属性支持哪些过滤器)。
    【解决方案2】:

    principalId 不支持$filter

    参考here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-28
      • 1970-01-01
      相关资源
      最近更新 更多