尝试以.net应用程序以编程方式访问Graph REST API时,获取错误"无法检查appId的目录读取访问权限"

Ama*_*rma 5 c# rest azure azure-active-directory microsoft-graph

我正在尝试使用C#中的.net应用程序中的Graph REST API自动获取AD报告.

我在新的Azure门户中创建了一个服务主体(使用应用程序注册).此服务主体具有为OAuth 2.0配置的所有必需信息:

  1. 应用ID或客户端ID(自动生成)
  2. 密钥或客户端密钥
  3. 租户ID(来自Azure目录的目录ID)

服务主体还具有为"Microsoft Graph"适当设置的权限,作为"读取目录数据".

我能够从.net应用程序使用REST API获取令牌,但是当我尝试在我的代码中使用此令牌时,我收到错误:" 无法检查appId的目录读取权限 ".

我使用令牌进行REST API调用的代码是(我已经更改了租户ID等的GUID):

        var client2 = new RestClient("https://graph.windows.net/a0a00aa0-aaaa-0000-0000-00000e0000aa/reports?api-version=beta");
        var request2 = new RestRequest(Method.GET);
        request2.AddHeader("cache-control", "no-cache");
        request2.AddHeader("authorization", "Bearer " + token);
        request2.AddHeader("content-type", "application/json");
        IRestResponse response2 = client2.Execute(request2);
        Console.WriteLine(response2.Content);
Run Code Online (Sandbox Code Playgroud)

我得到的错误是:

{
  "error":{
    "code":"Unable to check Directory Read access for appId: 00000aa-aaaa-0a0a-0000-000000000000","message":"message:Unable to check Directory Read access for appId: 00000aa-aaaa-0a0a-0000-000000000000\n client-request-id:00aa0a0a-48bf-4bf8-ae40-a2976a3c6910 timestamp:2017-04-28 01:38:52Z"
  }
}
Run Code Online (Sandbox Code Playgroud)

我已经检查过,凭据没有按照某些博客的指示缓存.我甚至从一个空白的VM运行代码并得到了同样的错误.任何指针来解决此错误或可能导致此错误的原因.

更新 - 4-28-2017

我解决了这个问题.我知道解决这个问题的确切步骤.但我不知道潜在的概念.如果有人能通过PowerShell或GUI向我解释以及如何做到这一点(即使是2行),我会接受这个作为答案.我采取的步骤是:

  1. 在应用程序注册中创建服务主体/应用程序
  2. 为"添加和读取用户配置文件"和"读取目录数据"添加Windows Azure AD的权限.我还为"读取目录数据"添加了Microsoft Graph的权限,因为我还需要对其进行一些调用.
  3. 添加邮递员的回复URL,即" https://www.getpostman.com/oauth2/callback ".
  4. 使用Postman的OAuth 2.0助手来获取令牌.在此过程中,它提供以下屏幕.单击"接受"后,它将生成令牌.
  5. 现在我可以使用C#代码发出请求了.

我尝试过:我尝试在应用程序注册中的"必需权限"刀片上使用"授予权限",但这不起作用并导致相同的错误.

问题:我想了解下面的对话框究竟是做什么的,以及如何通过GUI或PowerShell执行此操作.

权限提示

Nan*_* Yu 2

我测试了 api 调用并且它有效。在你的描述中:

\n\n
\n
\n

服务主体还具有为“Microsoft Graph”适当设置的权限作为“读取目录数据”。

\n
\n
\n\n

您设置了“Microsoft Graph”(Microrosft Graph API) 的权限,但在代码中查询了 Azure AD Graph API( https://graph.windows.net/ ) 终结点以获取报告信息。这可能会导致问题。如果您想使用Azure AD Graph API,您需要为“Windows Azure Active Directory”设置权限。

\n\n

更新

\n\n

同意框架用于轻松开发多租户 Web 和本机客户端应用程序,这些应用程序需要访问受 Azure AD 租户保护的 Web API(与注册客户端应用程序的地方不同)。

\n\n

对于多租户应用程序,当来自不同租户的用户首次登录应用程序时,Azure AD 会要求他们同意应用程序请求的权限。如果他们同意,则会在 user\xe2\x80\x99s 租户中创建称为服务主体的应用程序表示,并且可以继续登录。

\n\n

仅应用程序权限始终需要租户管理员\xe2\x80\x99s 的同意。如果您的应用程序请求仅限应用程序的权限,并且用户尝试登录该应用程序,则会显示一条错误消息,指出用户\xe2\x80\x99无法同意。某些委派权限还需要租户管理员\xe2\x80\x99的同意。例如,“读取目录数据”权限。这意味着,对于普通用户(即不是租户全局管理员的用户) )要登录,必须先由全局管理员代表组织登录并同意权限。您需要使用管理员帐户来同意相关权限,如图所示。请点击这里这里阅读有关用户和管理员同意的更多信息。

\n