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

时间:2019-04-22 08:12:49

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

我有一个能够调用Graph API的机器人框架应用程序。有一个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

1 个答案:

答案 0 :(得分:1)

您不能也不应使用Microsoft Graph的access_token作为受众来调用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。