我们有一个单页Javascript应用程序,该应用程序使用委派权限来调用Microsoft Graph API。 它要做的一件事是通过/ 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禁止访问。 令人困惑的是,他们可以获取完整的用户列表,但无法获取部分用户。
该用户本身是Guest用户,并且具有Guest Inviter目录角色。 这使他们能够读取所有用户。 我有一个全局管理员帐户,该帐户也可以使用第二个请求(如果不能,那将是非常惊人的)。
该应用程序本身具有必要的作用域,因为它能够读取用户,它仅取决于用户及其在AAD中的权限。
我的理论是用户没有访问userType
属性的权限,这导致403。
它可能是“完整个人资料”的一部分。
Philippe通过确认您无法通过User.ReadBasic.All范围访问此属性来确认了这一点。
如果我们查看来宾邀请者角色的权限: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
。
我的问题是,我需要怎么做才能为用户启用此查询? 在这种情况下,我想避免为他们提供Global Admin。
应用程序的令牌具有以下范围:
我们之前使用了特权范围较小的范围, 但是我们需要添加需要更高权限的功能。 我们拥有的范围是列出用户的“最特权”范围:https://developer.microsoft.com/en-us/graph/docs/api-reference/v1.0/api/user_list。
如果有所不同,该应用程序也将注册为本机应用程序。
注销并重新登录(以刷新令牌)也无济于事。 令牌中具有相同作用域的全新登录会发生此问题。 唯一的区别是用户在AAD中的角色。
请求ID:6079bcb2-6f90-44cc-8a57-83a8e1676333,时间戳记星期四,2018年11月15日06:49:59 GMT。
答案 0 :(得分:1)
不幸的是,关于来宾用户无法根据userType进行过滤的理论实际上是正确的。我刚刚与Microsoft Graph上这种逻辑背后的工程团队交谈过。他们正在这里寻找一个修补程序,以使它遵循此属性的基于角色的访问控制(RBAC),而不是当前正在执行的RBAC逻辑。目前尚无时间表,他们正在计划将其纳入冲刺。我会在接下来的几天里获取更新。
答案 1 :(得分:0)
如果您的应用程序仅具有https://graph.microsoft.com/User.ReadBasic.All
的委派权限,则很可能会遇到这种情况。仅使用User.ReadBasic.All
,您的应用无权读取userType
属性,这也意味着它无权对该属性进行过滤。
您可能会发现租户中的任何用户将具有相同的体验,包括成员或全局管理员,而不仅仅是访客用户。如果您的应用改为请求User.Read.All
,则该过滤器应按来宾邀请者角色中的来宾用户预期的那样工作。
答案 2 :(得分:-1)
您在Azure Active Directory->用户设置->外部协作设置-> 来宾用户权限受限制下设置了什么?
如果来宾权限受到限制,则来宾用户将无法枚举目录用户和组。