【问题标题】:Azure ADAL library to access Microsoft graph API用于访问 Microsoft 图形 API 的 Azure ADAL 库
【发布时间】:2020-02-05 18:46:30
【问题描述】:

我已经在 Azure AD 中注册了一个本机应用程序并授予所有委托访问图形 API 的权限。我正在尝试使用控制台解决方案 (exe) 测试此解决方案,其中包含以下代码,该代码使用客户端 ID 和密码

  private static async void AcquireTokenAsync() {
            AuthenticationContext context = new AuthenticationContext("https://login.windows.net/xxxxxx-xxxx-485b-a40f-xxxxxxxx/oauth2/token", true);
            var result = await context.AcquireTokenAsync("https://graph.microsoft.com",
                                                      new ClientCredential("xxxxxx-32cf-xxxx-8888-555555555555",
                                                      "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxV89cWfH0w="
                                                      )
                                                      );

            HttpClient client = new HttpClient();
            client.DefaultRequestHeaders.Add("Authorization", "Bearer " + result.AccessToken);
            HttpResponseMessage response = await client.GetAsync("https://graph.microsoft.com/v1.0/users/");
            string retResp = await response.Content.ReadAsStringAsync();
            string token = result.AccessToken;
            Console.WriteLine(token + "\n" + restResp);

}

检索令牌没有问题。我正在获取访问令牌,但在使用令牌的图形 api 调用中出现以下错误/响应

{
  "error": {
    "code": "Authorization_RequestDenied",
    "message": "Insufficient privileges to complete the operation.",
    "innerError": {
      "request-id": "cb7aaaa9-d9a0-485a-7777-b5bfe68ba771",
      "date": "2017-07-22T11:01:49"
    }
  }
}

请提出问题所在

【问题讨论】:

    标签: azure azure-active-directory microsoft-graph-api azure-ad-graph-api


    【解决方案1】:

    请查看委派权限和仅限应用权限here 之间的区别。

    您遇到的问题是您已请求对 Graph API 的委托权限,但随后您正在获取仅应用程序令牌,这需要不同类型的权限。如果您take a look at your token,您将看到您的令牌缺少调用图表所需的声明。

    相反,您需要执行以下操作之一:

    1. 按照授权码授予流程获取应用程序 + 用户令牌。这将导致对 Graph 的委派访问,并且您的调用应该可以工作。
    2. 请求图形 API 的仅限应用程序权限。这将允许您当前的身份验证方法访问 Graph API。但是,所有 App Only 权限都需要管理员同意该应用程序。

    【讨论】:

    • 谢谢肖恩!我已尝试使用应用程序并通过 Web API 应用程序注册委托权限。第 1 点很好,我能够访问资源(REST 调用)。
    • 对于第 2 点,您是指门户下的授予权限选项以供管理员同意。当我尝试在 Web API 上授予权限时,我可以通过委托或应用权限或两者来访问资源(相同的代码)。对于仅存在委托权限的本机 APP,我无法调用资源(权限不足)。我猜,通过本机应用程序的资源只能使用授权码授予流程访问。我还注意到,即使我删除了 Web API 的所有资源权限(授予后),我也能够进行调用并获得结果。
    • 是的,根据定义,本地客户端不能只进行应用调用,因为它不能保存客户端机密。在这种情况下,您必须始终使用委托流。
    • 感谢肖恩,++++ 分享decoder
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-12
    • 1970-01-01
    • 2017-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多