【问题标题】:Not able to get group info of another tenant using Microsoft graph API无法使用 Microsoft 图形 API 获取另一个租户的组信息
【发布时间】:2020-01-28 11:17:47
【问题描述】:

我在 Azure AD 门户中创建了两个目录。在一个目录中,我注册了客户端应用程序并授予了委派权限

  • User.Read
  • Directory.AccessAsUser.All
  • Directory.Read.All

我还为任何 Azure AD 目录设置了多租户以使用此应用程序。

登录成功后,我调用API(https://graph.microsoft.com/v1.0/me/memberOf)获取用户的群组信息。这仅适用于注册应用程序的目录中的用户。我确实获得了应用注册目录中用户的所有详细信息,例如 displayName 等。

当我通过属于另一个租户(目录)的用户登录时,登录成功,但我没有在 API 响应中获得完整的组数据(包括在下面)。我得到了正确的对象ID(组),但没有其他细节。

这似乎是我无法弄清楚的权限相关问题。任何人请建议。

{
    "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#directoryObjects",
    "value": [
        {
            "@odata.type": "#microsoft.graph.group",
            "id": "8bcd8779-8a74-4db7-83f0-8a5c5d076540",
            "deletedDateTime": null,
            "classification": null,
            "createdDateTime": null,
            "creationOptions": [],
            "description": null,
            "displayName": null,
            "groupTypes": [],
            "isAssignableToRole": null,
            "mail": null,
            "mailEnabled": null,
            "mailNickname": null,
            "onPremisesDomainName": null,
            "onPremisesLastSyncDateTime": null,
            "onPremisesNetBiosName": null,
            "onPremisesSamAccountName": null,
            "onPremisesSecurityIdentifier": null,
            "onPremisesSyncEnabled": null,
            "preferredDataLocation": null,
            "proxyAddresses": [],
            "renewedDateTime": null,
            "resourceBehaviorOptions": [],
            "resourceProvisioningOptions": [],
            "securityEnabled": null,
            "securityIdentifier": null,
            "visibility": null,
            "onPremisesProvisioningErrors": []
        }
    ]
}

我使用带有这些配置属性(id、秘密屏蔽)的 spring security oauth2 实现

azure:
  activedirectory:
    tenant-id: 66aeb78f-7a26-46c9-99ab-460c6309b21e
    active-directory-groups: Users
  client:
    client-id: 9618ac61-43ab-4c97-a9f1-769c91f48e08
    client-secret: DxndD0cBezR-AnrGuCH@?b1NpwtFj?47
    accessTokenUri: https://login.microsoftonline.com/common/oauth2/v2.0/token
    userAuthorizationUri: https://login.microsoftonline.com/common/oauth2/v2.0/authorize?prompt=select_account
    scope: user.read
  resource:
    userInfoUri: https://graph.microsoft.com/v1.0/me

【问题讨论】:

  • 您能分享一下您是如何获取访问令牌以调用 Microsoft Graph 的吗?
  • 先获取spring安全认证对象(SecurityContextHolder.getContext().getAuthentication()),然后从认证对象中获取token。我用配置属性更新了问题
  • 现在您已将客户端密码放在云端,您可能想要更改它...
  • 感谢您的提醒,但我已发布“更改的”客户端密码和 ID。

标签: azure-active-directory microsoft-graph-api


【解决方案1】:

当填充的唯一属性是对象 ID 时,您很可能处于 Limited information returned for inaccessible member objects 中描述的场景中。

简而言之,虽然您的应用确实有权读取登录用户是组成员的事实(感谢 User.Read)它没有有权读取该组的所有属性。

由于 Directory.Read.All 足以读取所有组属性,因此可能的结论是,在第二个租户中,您的应用实际上并未被授予您列出的所有三个权限,并且具有只被授予User.Read

注意:始终为您的方案选择最低权限。 Directory.AccessAsUser.All 应尽可能避免,因为它是 大多数 特权权限。对于您所描述的场景,您甚至可能不需要 Directory.Read.All。如果您只需要访问基本组详细信息(例如显示名称等),请尝试使用GroupMember.Read.All

【讨论】:

  • 首先我尝试使用 Group.Read.All,但它不起作用,所以想尝试使用 Directory.Read.All
【解决方案2】:

根据 Philippe 的回复,我搜索了在哪里以及如何在第二个租户中授予权限。这些链接帮助我了解了应用注册和企业应用之间的区别。

Azure App registeration vs Enterprise Applications

Difference between "enterprise application" and "app registration" in Azure

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 2012-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多