Authorization_RequestDenied 尝试使用 Graph 从 Azure Active Directory 获取组时 API
Authorization_RequestDenied when trying to get groups from Azure Active Directory using Graph API
我正在尝试使用图表 API 获取有关 Azure Active Directory 组的信息,但我一直收到 "Authorization_RequestDenied" 响应。
这个问题与 Insufficient privileges error when trying to fetch signed in user's group membership using Azure AD Graph API 类似,但那个问题的答案对我不起作用。
这是我所做的:
- 使用我的 Microsoft 帐户登录到 Azure 门户(例如
example@hotmail.com
)
- 设置用于测试的 Azure Active Directory 实例。实例的域类似于
examplehotmail247.onmicrosoft.com
- 创建了一个用户(
TestMember@examplehotmail247.onmicrosoft.com
)
- 创建了一些组,并使用户成为这些组的一部分
- 创建了一个 ASP.NET 应用程序,配置为使用 OpenID Connect 向 AAD 进行身份验证。
- 在 AAD 中注册应用程序,创建客户端密钥,回复 URL,等等
- 修改了 AAD 中的应用程序清单,以便返回组成员身份声明。
身份验证部分工作正常。用户登录后,我可以看到所有我期望的信息(姓名、ID 等),以及包含用户所属所有组 ID 的声明。
到目前为止,还不错。
现在,我想将这些组 ID 转换为人类可读的组名。为此,我使用 Microsoft.Azure.ActiveDirectory.GraphClient
NuGet 包,它提供了 GetObjectsByObjectIdsAsync
方法。此方法似乎是 getObjectsByObjectIds
REST 方法的包装器。
为了尝试让它工作,我做了以下工作:
- 在 Azure 门户中,我已向我的应用程序授予 "Sign in and read user profile" 和 "Read directory data" 权限。
- 至少使用我的 Microsoft 帐户登录到我的 ASP.NET 应用程序一次
我看到的:当我使用我的 Microsoft 帐户登录我的 ASP.NET 应用程序时,一切正常。但是,当我使用我创建的 AAD 帐户 (TestMember@examplehotmail247.onmicrosoft.com
) 登录时,它失败并出现以下错误:
[DataServiceClientException: {"odata.error":{"code":"Authorization_RequestDenied","message":{"lang":"en","value":"Insufficient privileges to complete the operation."},"requestId":"1234e0bb-3144-4494-a5fb-12a937147bcf","date":"2016-12-06T18:39:13"}}]
System.Data.Services.Client.BaseAsyncResult.EndExecute(Object source, String method, IAsyncResult asyncResult) +919
System.Data.Services.Client.QueryResult.EndExecuteQuery(Object source, String method, IAsyncResult asyncResult) +116
直接使用 REST api 尝试等效查询(即从图片中取出 ASP.NET)会得到相同的结果。
那么我在这里错过了什么?
更新: 我还授予应用程序以下委派权限(对 Windows Azure Active Directory):登录并读取用户配置文件、读取目录数据、访问作为登录用户的目录。但是,这没有任何区别。
更新 #2: 我什至让 TestMember@examplehotmail247.onmicrosoft.com
成为 AAD 实例的全局管理员,但它仍然没有帮助。
更新 #3: 好的,首先,澄清一下。用户登录后,我的 ASP.NET 应用程序从 OpenID Connect 流程获取授权代码。获得代码后,我将使用 AcquireTokenByAuthorizationCodeAsync
将其交换为访问令牌。访问令牌与用户相关联,因此我想依赖委托权限,而不是应用程序权限。
问题在于,尽管在 Azure 门户中向我的 ASP.NET 应用程序授予了适当的委派权限,但用户从未有机会同意这些权限。
我重新开始在 Azure 中为我的 ASP.NET 应用程序创建一个全新的应用程序注册,这是我发现的:当用户第一次登录时,他们被要求同意任何委托需要权限。但是,如果我在他们第一次登录后更改需要哪些委派权限,则用户下次登录时不会征得同意(对于新需要的权限)。
这绝对不是我所期望的,所以我要打开一个关于这个的新问题。
我正在尝试使用图表 API 获取有关 Azure Active Directory 组的信息,但我一直收到 "Authorization_RequestDenied" 响应。
这个问题与 Insufficient privileges error when trying to fetch signed in user's group membership using Azure AD Graph API 类似,但那个问题的答案对我不起作用。
这是我所做的:
- 使用我的 Microsoft 帐户登录到 Azure 门户(例如
example@hotmail.com
) - 设置用于测试的 Azure Active Directory 实例。实例的域类似于
examplehotmail247.onmicrosoft.com
- 创建了一个用户(
TestMember@examplehotmail247.onmicrosoft.com
) - 创建了一些组,并使用户成为这些组的一部分
- 创建了一个 ASP.NET 应用程序,配置为使用 OpenID Connect 向 AAD 进行身份验证。
- 在 AAD 中注册应用程序,创建客户端密钥,回复 URL,等等
- 修改了 AAD 中的应用程序清单,以便返回组成员身份声明。
身份验证部分工作正常。用户登录后,我可以看到所有我期望的信息(姓名、ID 等),以及包含用户所属所有组 ID 的声明。
到目前为止,还不错。
现在,我想将这些组 ID 转换为人类可读的组名。为此,我使用 Microsoft.Azure.ActiveDirectory.GraphClient
NuGet 包,它提供了 GetObjectsByObjectIdsAsync
方法。此方法似乎是 getObjectsByObjectIds
REST 方法的包装器。
为了尝试让它工作,我做了以下工作:
- 在 Azure 门户中,我已向我的应用程序授予 "Sign in and read user profile" 和 "Read directory data" 权限。
- 至少使用我的 Microsoft 帐户登录到我的 ASP.NET 应用程序一次
我看到的:当我使用我的 Microsoft 帐户登录我的 ASP.NET 应用程序时,一切正常。但是,当我使用我创建的 AAD 帐户 (TestMember@examplehotmail247.onmicrosoft.com
) 登录时,它失败并出现以下错误:
[DataServiceClientException: {"odata.error":{"code":"Authorization_RequestDenied","message":{"lang":"en","value":"Insufficient privileges to complete the operation."},"requestId":"1234e0bb-3144-4494-a5fb-12a937147bcf","date":"2016-12-06T18:39:13"}}] System.Data.Services.Client.BaseAsyncResult.EndExecute(Object source, String method, IAsyncResult asyncResult) +919 System.Data.Services.Client.QueryResult.EndExecuteQuery(Object source, String method, IAsyncResult asyncResult) +116
直接使用 REST api 尝试等效查询(即从图片中取出 ASP.NET)会得到相同的结果。
那么我在这里错过了什么?
更新: 我还授予应用程序以下委派权限(对 Windows Azure Active Directory):登录并读取用户配置文件、读取目录数据、访问作为登录用户的目录。但是,这没有任何区别。
更新 #2: 我什至让 TestMember@examplehotmail247.onmicrosoft.com
成为 AAD 实例的全局管理员,但它仍然没有帮助。
更新 #3: 好的,首先,澄清一下。用户登录后,我的 ASP.NET 应用程序从 OpenID Connect 流程获取授权代码。获得代码后,我将使用 AcquireTokenByAuthorizationCodeAsync
将其交换为访问令牌。访问令牌与用户相关联,因此我想依赖委托权限,而不是应用程序权限。
问题在于,尽管在 Azure 门户中向我的 ASP.NET 应用程序授予了适当的委派权限,但用户从未有机会同意这些权限。
我重新开始在 Azure 中为我的 ASP.NET 应用程序创建一个全新的应用程序注册,这是我发现的:当用户第一次登录时,他们被要求同意任何委托需要权限。但是,如果我在他们第一次登录后更改需要哪些委派权限,则用户下次登录时不会征得同意(对于新需要的权限)。
这绝对不是我所期望的,所以我要打开一个关于这个的新问题。