我知道这已经被问过很多次了,但是我还没找到解决问题的方法。
问题:
我需要使用COM应用程序使用CSOM和JWT令牌从Sharepoint Online站点下载文件。当我到达我称之为这种方法的地步时
File.OpenBinaryDirect(ClientContext context, string serverRelativeUrl);
我收到401 Unauthorized错误。
我使用证书在Azure AD中验证我的应用程序。它适用于访问SharePoint列表,列表项等,这意味着下载文件是我收到此错误消息的唯一部分。
我做了什么
我已就此事做了一些研究,并在2年前(https://social.msdn.microsoft.com/Forums/office/en-US/7746d857-d351-49cc-b2f0-496663239e02/how-to-download-a-file-version-from-office-365-using-csom?forum=sharepointdevelopment)在MSDN上发现了一个线程,提到使用访问令牌从SP下载文件是不可能的。
这是一个老线程,所以从那时起一定有些变化,但到目前为止我还没有找到一个可行的解决方案。
我在互联网上遇到的所有文章都提到了为上下文提供用户凭据。但我的客户坚持使用证书。因此,我不能使用这种方法
问题
有没有办法可以使用JWT令牌从Sharepoint Online下载文件?
答案 0 :(得分:2)
在寻找解决方案时,我偶然发现了一篇描述Sharepoint Online REST API的MSDN文章,并且有一个File端点,我决定尝试一下。 以下是我的想法:
public byte[] GetFileContent(File file)
{
var request = System.Net.HttpWebRequest
.Create($"{_serviceDefinition.ServiceId}/_api/Web/getfilebyserverrelativeurl('{file.ServerRelativeUrl}')/$value");
request.Headers.Add(System.Net.HttpRequestHeader.Authorization, $"Bearer {GetAccessToken()}");
byte[] fileData = new byte[0];
using (var sr = request.GetResponse().GetResponseStream())
{
using (var ms = new System.IO.MemoryStream())
{
byte[] buffer = new byte[0x1000];
int bytes;
while ((bytes = sr.Read(buffer, 0, buffer.Length)) > 0)
{
ms.Write(buffer, 0, bytes);
}
fileData = ms.ToArray();
}
}
return fileData;
}
长话短说我在以下URL创建了一个HttpWebRequest:https:// {address.of.your.sharepoint.site} / _api / Web / getfilebyserverrelativeurl('{file.ServerRelativeUrl}')/ $ value,add我对请求的持有者令牌,然后将响应读入字节数组以供进一步处理。
像魅力一样,但有点打破了CSOM的概念。