【问题标题】:How to download a file from Sharepoint Online using an access token如何使用访问令牌从 Sharepoint Online 下载文件
【发布时间】:2016-07-23 06:28:00
【问题描述】:

我知道这个问题已经被问过很多次了,但我还没有找到解决问题的有效方法。

问题:

我需要使用 C# 应用(使用 CSOM 和 JWT 令牌)从 Sharepoint Online 站点下载文件。当我到了调用这个方法的地步

File.OpenBinaryDirect(ClientContext context, string serverRelativeUrl);

我收到 401 Unauthorized 错误。

我在 Azure AD 中使用证书对我的应用程序进行身份验证。它适用于访问 SharePoint 列表、列表项等,这意味着下载文件是我收到此错误消息的唯一部分。

我做了什么

我对此事进行了一些研究,发现两年前在 MSDN 上的一个帖子 (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) 提到无法使用访问令牌从 SP 下载文件。

这是一个旧线程,所以从那以后肯定发生了一些变化,但到目前为止我还没有找到可行的解决方案。

我在 Internet 上看到的所有文章都提到了为上下文提供用户凭据。但我的客户坚持使用证书。因此我不能使用这种方法

问题

我是否可以使用 JWT 令牌从 Sharepoint Online 下载文件?

【问题讨论】:

    标签: c# .net jwt sharepoint-online adal


    【解决方案1】:

    在寻找解决方案时,我偶然发现了一篇描述 Sharepoint Online REST API 的 MSDN 文章,其中有一个文件端点,我决定试一试。 这是我想出的:

    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,添加我对请求的不记名令牌,然后将响应读入字节数组以进行进一步处理。

    像一个魅力,但有点打破了 CSOM 的概念。

    【讨论】:

    • 是的,这就是票。如果您在 CSOM 中,您只需切换到下载的 HTTP 客户端版本并确保它具有承载令牌
    猜你喜欢
    • 2013-09-22
    • 2021-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-18
    • 2019-10-24
    • 1970-01-01
    相关资源
    最近更新 更多