【问题标题】:Getting 403: "Insufficient privileges to complete the operation." when attempting to query Graph API获取 403:“权限不足,无法完成操作。”尝试查询 Graph API 时
【发布时间】:2016-11-03 17:42:14
【问题描述】:

我们已迁移到我工作的新租户。因此,我们正在尝试将我们的应用程序重新添加到 Azure AD 中。我们有一个记录在案的过程,该过程过去一直有效,以便为我们的 MVC 和 WebAPI 项目添加应用程序。但是,我们在尝试查询 Graph API 时遇到了错误。在示例应用程序中,我们使用此处的代码创建了一个自定义授权属性,该属性允许我们基于组进行身份验证。调试 /Utilities/GraphHelper.cs 后,我们确定应用程序收到 403 状态错误,并显示一条消息:“权限不足,无法完成操作。”

经过一番研究,我能够在 Fiddler 中复制身份验证过程。

操作方法:POST

网址:https://login.windows.net/[tennantName]/oauth2/token?api-version=1.0

标题块:

Content-Type: application/x-www-form-urlencoded 
Host: login.windows.net
Content-Length: 180
Expect: 100-continue 
Connection: Keep-Alive

请求正文:

grant_type=client_credentials&resource=https%3a%2f%2fgraph.windows.net&client_id=[clientId]&client_secret=[urlencoded client secret]

我从这个请求中取回一个令牌,然后尝试使用 fiddler 再次从 graphapi 查询联合目录:

操作方法:GET

网址:https://graph.windows.net/[federateddomain]/directoryObjects/{group-guid}

标题块:

Content-Type: application/json
Host: graph.windows.net
Authorization: Bearer [token from login response]

我收到了带有正文的 403 响应:

{"odata.error":{"code":"Authorization_RequestDenied","message":{"lang":"en","value":"Insufficient privileges to complete the operation."}}}

在 Azure Active Directory 中,在此应用程序的应用注册下,清单已由具有公司管理员角色的用户修改:

"groupMembershipClaims": "SecurityGroup", ...
"oauth2AllowImplicitFlow": true, 

生成了一个应用程序密钥,用于获取令牌以访问图形 API。 在所需的应用程序权限下,读取目录数据和读取所有隐藏的成员资格由具有公司管理员角色的用户检查。

我没有想法,一切都应该正常工作。

【问题讨论】:

  • 您是否通过解析 jwt 令牌(jwt.io)验证了权限已添加到令牌中?如果不存在,您可能必须为用户重新同意。
  • 图形 api 调用发生在应用程序级别,不需要用户同意。
  • 令牌中的roles 声明是什么?
  • 我如何找到它。我解码了令牌,但我没有在有效负载中看到角色声明。
  • 您收到的访问令牌应包含已授予您的应用访问 Graph API 的权限。类似于 Directory.Read.All.

标签: azure azure-active-directory


【解决方案1】:

我调用了 Azure 的 MSFT 支持,显然 portal.azure.com 分配权限存在问题。我能够通过转到经典门户并重新分配权限来解决此问题。

【讨论】:

    【解决方案2】:

    客户端应用程序对 AAD Graph API 的访问权限取决于您在应用程序上注册的权限。

    请注意,在应用注册过程中有一个部分称为“对其他应用程序的权限”,您需要将 Graph API 指定为要调用的资源,并且您必须指定您需要的权限级别调用该 API。

    在此处阅读更多信息:https://azure.microsoft.com/en-us/documentation/articles/active-directory-integrating-applications/

    在 Azure 经典门户中 Web 客户端应用程序的配置页面上,使用“其他应用程序权限”控件中的下拉菜单设置应用程序所需的权限。

    您可以在此处阅读有关 Graph API 公开的各种范围/权限的更多信息:https://msdn.microsoft.com/Library/Azure/Ad/Graph/howto/azure-ad-graph-api-permission-scopes

    选择这些权限是第一步,但这还不足以让您的应用真正获得所需的正确访问权限。您缺少的步骤是同意。每个应用程序都需要一定程度的用户同意才能通过 Graph API 访问其租户的数据。即使您的应用程序正在执行仅应用程序流(使用客户端凭据流充当守护程序服务),您仍然需要获得要访问数据的租户管理员的初始权限。这意味着您第一次使用该应用程序时,您必须触发交互式登录体验。如果您是配置应用程序的管理员,当您使用“management.windowsazure.com”门户时,此过程可能会“自动”发生,因为他们会自动代表您同意该应用程序,但是在所有其他情况下,您必须遵循自己获得用户同意的正常过程。

    使用正确的权限范围正确配置应用并获得同意后,您应该会在访问令牌中看到“范围”或“角色”声明,它们代表了您的应用被授权的权限。

    利用这些知识,我希望您能够解决您面临的问题。

    【讨论】: