尝试从 .net 应用程序以编程方式访问 Graph REST API 时出现错误 "Unable to check Directory Read access for appId"

Getting error "Unable to check Directory Read access for appId" when trying to access Graph REST API programmatically from a .net application

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

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

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

服务主体还为 "Microsoft Graph" 和 "Read Directory Data" 适当设置了权限。

我可以使用 REST API 从 .net 应用程序中获取令牌,但是当我尝试在我的代码中使用此令牌时,出现错误:“无法检查 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);

我得到的错误是:

{
  "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"
  }
}

我已经检查过凭据没有像某些博客指出的那样缓存在任何地方。我什至 运行 来自空白 VM 的代码并得到了同样的错误。解决此错误或可能导致此错误的任何指示。

更新 - 2017 年 4 月 28 日

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

  1. 在 App Registrations
  2. 中创建服务 Principal/App
  3. 为 Windows 添加 "Sing in and read user profile" 和 "Read directory data" 的 Azure AD 权限。我还为 "Read directory data" 添加了 Microsoft Graph 的权限,因为我还需要对其进行一些调用。
  4. 为 Postman 添加回复 URL,即“https://www.getpostman.com/oauth2/callback”。
  5. 使用 Postman 的 OAuth 2.0 助手获取令牌。在此过程中,它提供以下屏幕。单击“接受”后,它会生成令牌。
  6. 现在我可以使用 C# 代码发出请求了。

我试过的方法: 我试过在应用程序注册中的 "Required Permissions" blade 上使用 "Grant Permissions",但这没有用并导致相同的错误。

问题:我想了解下面的对话框到底在做什么,以及如何通过 GUI 或 PowerShell 执行此操作。

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

The service principal also has permissions set appropriately for "Microsoft Graph" as "Read Directory Data".

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

更新

同意框架用于轻松开发需要访问 Web API 的多租户 Web 和本机客户端应用程序,这些应用程序由 Azure AD 租户保护,不同于客户端应用程序所在的租户已注册。

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

仅限应用程序的权限始终需要征得租户管理员的同意。如果您的应用程序请求仅限应用程序的权限,并且用户尝试登录该应用程序,则会显示一条错误消息,指出用户无法同意。某些委托权限还需要租户管理员的同意。例如,"Read directory data"权限。这意味着为了让普通用户(即不是租户全局管理员的用户)登录,一个全局管理员必须首先代表 organisation.You 登录并同意权限,需要使用管理员帐户同意相关权限,如您显示的图片。请单击 here and here 阅读有关用户和管理员许可的更多信息。