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

标签 c# rest azure azure-active-directory microsoft-graph-api

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

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

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

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

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

我使用 token 进行 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"
  }
}

我已经检查过,正如一些博客所指出的那样,凭据没有缓存在任何地方。我什至从空白虚拟机运行代码并得到相同的错误。解决此错误或可能导致此错误的任何指示。

更新 - 2017 年 4 月 28 日

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

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

我尝试过的操作:我尝试在应用程序注册内的“必需权限”边栏选项卡上使用“授予权限”,但这不起作用并导致了相同的错误。

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

Permissions Prompt

最佳答案

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

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

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

更新

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

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

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

关于c# - 尝试从 .net 应用程序以编程方式访问 Graph REST API 时出现错误 "Unable to check Directory Read access for appId",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43670714/

相关文章:

c# - Azure 通知中心格式标记负载 REST API

node.js - Nodejs Azure 部署失败 : ENOENT: no such file or directory, 统计 '/home/site/wwwroot/node_modules/.bin/semver'

c# - 如何防止 C# 在我的测试 Controller 中包装我的 JSON 输出?

c# - 从同步服务层边界调用异步方法

azure - 微软 Azure 是否有任何其他 API 或 SDK 可以为我提供 azure galary 上所有图像的列表?

java - JAX-RS 应用程序未收到 Apache Wink Rest 客户端错误的正文

java - 让 Spring DispacherServlet 解析正确的 URLmap

python - 如何使用 Azure Python SDK 获取 Azure VM 正常运行时间/运行时间(运行状态时间)

postgresql - Airflow - 为什么外部数据库配置会破坏 helm 升级?

c# - "Could not find endpoint element with name..."