代码之家  ›  专栏  ›  技术社区  ›  juunas

使用$filter从MS Graph API获取用户会导致某些用户出现403

  •  0
  • juunas  · 技术社区  · 7 年前

    它所做的一件事是通过/users端点获取用户列表。

    现在,当请求URL https://graph.microsoft.com/v1.0/users?$select=id,displayName,givenName,surname,mail,userPrincipalName 一切都很顺利。

    但后来我们把它改成了一个过滤器。 具体来说,我们只需要来宾用户。 因此,我们将请求URL更改为 https://graph.microsoft.com/v1.0/users?$filter=userType eq 'Guest'&$select=id,displayName,givenName,surname,mail,userPrincipalName,userType

    现在,当我们尝试进行查询时,一些用户得到了403禁止。 令人费解的是,他们可以获得完整的用户列表,但无法获得用户的子集。

    此用户本身是来宾用户,具有来宾邀请者目录角色。 这使他们能够读取所有用户。 我有一个全局管理员帐户,也可以使用第二个请求(如果不能,那将是非常惊人的)。

    我的理论是,用户没有权限访问 userType 属性,这将导致403。

    如果我们查看来宾邀请者角色的权限: https://docs.microsoft.com/en-us/azure/active-directory/users-groups-roles/directory-assign-admin-roles#guest-inviter . 我们可以看到他们有 microsoft.aad.directory/users/basic/read ,另一方面,全局管理员具有 microsoft.aad.directory/users/allProperties/allTasks .

    我想避免在这种情况下给他们全局管理。

    应用程序的令牌具有以下作用域:

    • Directory.AccessAsUser.All

    我们以前使用的是一个权限较低的作用域, 我们拥有的范围是列出用户的“最特权”范围: https://developer.microsoft.com/en-us/graph/docs/api-reference/v1.0/api/user_list .

    注销和重新登录(刷新令牌)也没有帮助。 此问题发生在令牌中具有相同作用域的新登录时。 唯一的区别是用户在AAD中的角色。

    请求id:6079bcb2-6f90-44cc-8a57-83a8e1676333,时间戳Thu,2018年11月15日06:49:59 GMT。

    3 回复  |  直到 7 年前
        1
  •  1
  •   Jeremy Thake MSFT    7 年前

    不幸的是,关于来宾用户不能根据用户类型进行筛选,您的理论实际上是正确的。我刚刚与Microsoft Graph上这一逻辑背后的工程团队进行了交谈。他们正在研究一个修复方案,以便它遵守我们针对该属性的基于角色的访问控制(RBAC),而不是它现在正在执行的前RBAC逻辑。目前还没有时间框架,他们正在计划冲刺。我看看能否在未来几天内得到最新消息。

        2
  •  0
  •   Philippe Signoret    7 年前

    如果您的应用程序仅具有对的委派权限,则很可能会遇到这种情况 https://graph.microsoft.com/User.ReadBasic.All . 只有 User.ReadBasic.All ,您的应用程序没有读取 userType

    你可能会发现 任何 租户中的用户将具有相同的体验,包括成员或全局管理员,而不仅仅是您的来宾用户。如果您的应用程序请求 User.Read.All 相反,过滤器应该按照来宾邀请者角色中的来宾用户的预期工作。

        3
  •  -1
  •   Zacharious    7 年前

    来宾用户权限有限

    如果来宾权限受到限制,来宾用户将无法枚举目录用户&组。