使用相同的AAD令牌调用SharePoint Online

问题描述 投票:1回答:1

我有一个能够调用Graph API的bot框架应用程序。有一个oauth身份验证流程可以将我的用户登录到bot应用程序。我可以像以下请求一样查询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
c# azure-active-directory microsoft-graph sharepoint-online
1个回答
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中访问令牌的详细信息,请参阅:qazxsw poi

更多信息:

如果您想使用SPO API,我们需要先使用https://docs.microsoft.com/en-us/azure/active-directory/develop/access-tokens#validating-tokens查找正确的服务API端点。但是,Microsoft不再支持此功能,因为新创建的应用程序由于弃用而无法访问O365发现端点。

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

© www.soinside.com 2019 - 2024. All rights reserved.