【问题标题】:Call SharePoint Online with same AAD token使用相同的 AAD 令牌调用 SharePoint Online
【发布时间】:2019-09-11 11:01:31
【问题描述】:

我有一个能够调用 Graph API 的机器人框架应用程序。有一个 oauth 身份验证流程可以让我的用户登录到机器人应用程序。我可以像以下请求一样查询 Graph API:

  • https://graph.microsoft.com/v1.0/me

  • https://graph.microsoft.com/v1.0/sites/xxxx.sharepoint.com:/sites/test:/lists/Test/items

我想使用与调用 Graph API 相同的令牌查询 SharePoint Online API。我在 Azure 门户中的 AAD 应用程序中提供了必要的权限。我写了下面的代码,但我从 SPO API 得到了 401 Not Authorized 异常。如何使用相同的令牌调用 SPO API?

ClientContext context = TokenHelper.GetClientContextWithAccessToken("https://mytenant.sharepoint.com/sites/test/", _token);
SharePoint.Client.List testList = context.Web.Lists.GetByTitle("Test");
CamlQuery query = CamlQuery.CreateAllItemsQuery(100);
ListItemCollection items = testList.GetItems(query);
context.Load(items);
context.ExecuteQuery(); //Fires 401 error

【问题讨论】:

  • 您找到解决方案了吗?我的职位完全相同...我需要从 Bot 框架调用 SharePoint Online Search Rest API。
  • 很抱歉,我找不到任何解决方案。正如我从下面的评论中了解到的那样,无法使用 Graph API 令牌调用另一个 API。

标签: c# azure-active-directory microsoft-graph-api sharepoint-online


【解决方案1】:

您不能也不应该将 access_token 与 Microsoft Graph 一起用作调用 SPO API 的受众。

原因:

在 Azure AD access_token 中,它必须包含“aud”声明。

  • 它标识了令牌的预期接收者。在访问令牌中,受众是资源应用的应用程序 ID 或标识符,分配给 Azure 门户中的应用程序。 资源应用应验证此值并在值不匹配时拒绝令牌。

  • 因此,在第一个 access_token 中,它的受众应该是 Microsoft Graph API,而不是 SPO API。 当您尝试使用 access_token 调用 Microsoft Graph API 时,应验证“aud”声明。 但是,如果您尝试使用该 access_token 调用 SPO API,“aud”声明值将不会被验证,SPO API 会将其视为无效的 acc_token 并给出“401 未授权”响应。

在 Azure AD 中查看有关 access_token 的更多详细信息:https://docs.microsoft.com/en-us/azure/active-directory/develop/access-tokens#validating-tokens

更多信息:

如果要使用 SPO API,我们需要先使用Office 365 Discovery service 找到正确的服务 API 端点。但是,Microsoft 不再支持此功能,因为新创建的应用程序由于弃用而无法访问 O365 发现端点。

目前,我们建议您改用 Microsoft Graph API。

【讨论】:

  • 感谢您的快速回复。我理解您的观点,但在 Graph (SharePoint) API 中无法执行某些操作。所以我需要直接在我的代码中连接我的 SPO 租户。是否可以在调用 SPO 之前生成新令牌?
  • 嗨@Murat,我真的能理解你的意思。没错,MS Graph API 中的站点部分有一些限制。但是,正如我所提到的,您需要首先使用 O365 Discovery 服务来找到正确的 API 端点。然后,您需要使用旧应用注册来连接 SPO API 服务。换句话说,不再直接支持 SPO API。
  • 我在 Graph api 中看到过任何等效的 SharePoint 搜索 api,有什么建议吗? ""zzz.sharepointonline.com/_api/search/…'"
  • 摆脱企业共享点就是答案。微软在这方面丢球了。当 Azure“Sharepoitn Online”(而不是 Graph)的权限中特别列出时,您不能使用单个 Azure 令牌访问 Sharepoint API,这完全是愚蠢的。总垃圾产品。
猜你喜欢
  • 2021-11-10
  • 2019-10-24
  • 1970-01-01
  • 2021-07-28
  • 1970-01-01
  • 2021-01-12
  • 2017-04-17
  • 2018-03-02
  • 2016-07-23
相关资源
最近更新 更多