【问题标题】:How to list all appRoleAssignments in Microsoft Graph API or Azure AD Graph API如何在 Microsoft Graph API 或 Azure AD Graph API 中列出所有 appRoleAssignments
【发布时间】:2017-10-18 12:01:57
【问题描述】:

我可以看到如何在 AAD Graph 中查询给定用户的 appRoleAssignments:

https://graph.windows.net/{my-tenant}/users/{user-guid}/appRoleAssignments

但我找不到检索域内所有 appRoleAssignments 的方法。我的用例是 Power BI(报告工具),虽然我可以获取所有应用程序、所有用户,然后为每个用户运行查询,但考虑到成千上万的用户和应用程序,这将非常昂贵。

理想情况下,我会检索所有应用程序(检查)、所有用户(检查)和所有 appRoleAssignments 以链接它们(这个问题)。

试过这个: https://graph.microsoft.com/beta/appRoleAssignments

但是回来:

不支持直接查询此资源类型。

试过这个: https://graph.windows.net/{租户}/appRoleAssignments

但是得到这个:

未找到段“appRoleAssignments”的资源

【问题讨论】:

    标签: microsoft-graph-api azure-ad-graph-api


    【解决方案1】:

    无法跨整个租户查询appRoleAssignment 资源。它需要限定为父资源,userservicePrincipalgroup

    跳出框框思考,您也许能够编译一个集合,而无需像预期的那样多的开销。为此,您需要将其存储在 AD 之外并定期刷新数据集。

    如果您通常主要关注user 分配,您可以尝试使用/delta 查询user 资源列表。这将使您仅检索已更改的user 资源。获得user 后,您可以为它们检索appRoleAssignment 资源并将它们存储在您的外部数据存储中。

    对于可能分配给给定用户的潜在 appRole 资源列表,您可以通过从租户中检索 application 资源列表并查看 appRoles 属性 (/beta/applications?$select=appRoles) 来获取此信息.

    对于近乎实时的更改,您可以使用/beta/users/delta,然后定期轮询userapplication 集合以完全刷新更大的数据集。

    请记住,这不是我试图 POC 的事情,因此可能存在我没有考虑的问题。它完全在 /beta 端点内,这意味着 API 行为和数据集可以随时更改而不会发出警告。 也就是说,这是一个非常有趣的思想驱魔。我很想知道你在哪里结束了这个。


    只是为了向可能在搜索中显示此内容的任何人澄清一下,Azure AD Graph 和 Microsoft Graph 是两个独立的 API,并且用户的权限范围和语法不同。一般来说,开发人员应尽可能使用 Microsoft Graph,因为它最终会取代旧的 Azure AD Graph。

    【讨论】:

    • 谢谢马克。我可以看到 Azure AD 图有一个 appRoles 列,但我似乎无法让它返回该列中的任何数据。我尝试将 "?$expand=appRoles" 添加到查询 URL,但它仍然返回一个空列表
    • 啊哈!看起来您正在使用 $select 方法朝着正确的方向前进。我无法让它返回用户表上的任何数据,但能够使用“graph.windows.net{tenant}/users?$expand=appRoleAssignments”检索 /users 上的 appRoleAssignments(请注意,这是在较旧的 azure 图上并且在较新的 Microsoft Graph API 上似乎没有类似的选项)。所以这是我现在能得到的最好的答案 - 谢谢!
    • 要记住的一点是servicePrincipalapplication 之间的区别。对于租户不拥有注册的多租户应用程序(例如 Graph Explorer),这些显示在servicePrincipal
    【解决方案2】:

    我无法投票或标记答案,因为我的声誉太低而无法这样做。 无论如何,非常感谢Marc Lafleur 让我朝着正确的方向前进。 似乎没有办法单独检索应用程序/用户列表,但是将 /users 调用上的 appRoleAssignments 扩展到 Azure Graph API 就可以解决问题。请注意,使用较新的 Microsoft Graph API 似乎没有类似的方法可以做到这一点:(

    这就是开启魔法为我工作的电话:

    https://graph.windows.net/my-tenant/users?$expand=appRoleAssignments
    

    【讨论】:

    • 同样的调用也应该在 Microsoft Graph 的 /beta 中工作,只是它有一个错误。您还应该知道,由于性能限制,AAD Graph 中的 $expand 操作仅限于返回扩展中的 20 个项目。如果用户分配了超过 20 个应用程序,您会错过其中的一些。 Microsoft Graph 中的目录操作也是如此,因为它本质上位于 AAD Graph 之上。
    【解决方案3】:

    这对我有用...(经典图表)

     https://graph.windows.net/{tenant-id-AsGuid-NoBraces}/users/{UserId-AsGuid-NoBraces}/appRoleAssignments?api-version=1.6 
    

    响应将在用户上下文中 - 因此用户将是 principalID。

    应用程序 ID 将在 resourceID 中 - 这不是应用程序 ID。这是应用注册指向的 objectId。

    (关于您的情况的评论) 起初,您试图通过查询所有用户来获取“所有列表”的一般困境似乎是一个真正的问题。我通过使用已知列表来避免这种情况。我选择使用已知列表的原因是我们的环境中有许多其他应用程序,我的应用程序不知道或操作权限来通过代码列出或操作。我只针对已知的应用注册目标列表及其底层对象 ID 工作。所以这就是我避免你的一般困境的方法。

    Azure 门户(在我的例子中)向我显示了我需要知道的基础 ID,以便添加到我的应用特定注册列表中。

    这个 API 可能对你有用 - 我选择不使用它 - 但我不记得为什么了。

    https://graph.windows.net/{tenant-id-AsGuid-NoBraces}/servicePrincipals/{AppOBJECTID-AsGuid-NoBraces}/appRolesAssignedTo?api-version=1.6
    

    .

    【讨论】:

    • 谢谢你,但恐怕这对我没有帮助。我们使用 PowerBI 来显示可以访问哪些应用程序的内部和外部用户(每个都有数千个)。同样的查询格式对我有用(如上所述),但不适合我提出的用例,所以问题仍然是“是否可以在单个请求中返回所有 appRoleAssignments?”)。如果答案是否定的,那就这样吧!
    • 除了 Graph 之外,还有其他方法可以了解 AD 商店的内容。此外,“新”图表的 beta 端点也开始支持对象,因此您可能不会再不走运了。这就是您的“直接查询”错误的全部内容 - 它们阻止您在新图表中提取非直接支持的类型 - 即使您显然只是通过调用访问了该对象。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-02
    • 1970-01-01
    • 1970-01-01
    • 2019-04-07
    • 1970-01-01
    相关资源
    最近更新 更多