Azure 获取403:“引用;权限不足,无法完成操作。”;尝试查询图形API时

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

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

在做了一些研究之后,我能够在Fiddler中复制身份验证过程

行动方法:张贴

网址:

标题块:

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查询联邦目录:

操作方法:获取

URL:domain]/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, 
生成了用于获取令牌以访问graph API的应用程序密钥。 在“应用程序权限的必需权限”下,具有公司管理员角色的用户检查了“读取目录数据”和“读取所有隐藏成员身份”


我没有主意了,一切都应该正常运转

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

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

请在此处阅读更多信息:

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

您可以在此处阅读有关Graph API公开的各种作用域/权限的更多信息:

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

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


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

我打电话给Azure的MSFT支持,很明显,portal.Azure.com在分配权限方面存在问题。我可以通过访问classic portal并重新分配权限来解决此问题。

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