【问题标题】:unable to download file with clientid and client secret无法下载带有客户端 ID 和客户端密码的文件
【发布时间】:2022-08-02 15:25:31
【问题描述】:

我需要使用控制台应用程序从 SPO 的列表中下载文件。由于用户启用了 MFA,我使用的是 clientid、clientsecret。

我能够读取元数据,但是当我尝试下载文件时,它会引发 401 未经授权的异常。

由于 windows 域和 SharePoint 域不同,我无法传递上下文当前凭据。

那么,代码中是否缺少某些内容,或者我是否必须使用 MFA 身份验证才能下载文件。

这是c#代码:

using (var cc = new OfficeDevPnP.Core.AuthenticationManager().GetAppOnlyAuthenticatedContext(siteCollectionUrl,ClientId,clientSecret))
            {
                Web oWebsite = cc.Web;

                List list = cc.Web.Lists.GetByTitle(\"Shared Documents\");
                CamlQuery camlQuery = new CamlQuery();
                camlQuery.ViewXml = \"<View Scope=\'RecursiveAll\'>\" +
                          \"<Query>\" +
                              \"<Where>\" +
                                    \"<Eq>\" +
                                         \"<FieldRef Name=\'FSObjType\' />\" +
                                         \"<Value Type=\'Integer\'>0</Value>\" +
                                    \"</Eq>\" +
                             \"</Where>\" +
                           \"</Query>\" +
                        \"</View>\";//\"<View><RowLimit>10000</RowLimit></View>\";
                ListItemCollection colllist = list.GetItems(camlQuery);
                cc.Load(colllist);
                cc.ExecuteQuery();
                Console.WriteLine(cc.Web.Title);
                foreach (ListItem oListItem in colllist)
                {
                    DownloadAFile(oListItem, @\"C:\\Downloads\");

                }
            };

private static void DownloadAFile(Microsoft.SharePoint.Client.ListItem item, string targetPath)
    {
        var ctx = (ClientContext)item.Context;
        var fileRef = (string)item[\"FileRef\"];
        var fileName = System.IO.Path.GetFileName(fileRef);
        var fileInfo = Microsoft.SharePoint.Client.File.OpenBinaryDirect(ctx, fileRef);
        var filePath = System.IO.Path.Combine(targetPath, fileName);
        using (var fileStream = System.IO.File.Create(filePath))
        {
            fileInfo.Stream.CopyTo(fileStream);
        }
    }
  • 我目前正在对这个问题进行一些研究,会尽快让你知道。

标签: c# sharepoint-online office-dev-pnp


【解决方案1】:

根据我的研究和测试,您可以使用以下代码通过 CSOM 将 SharePoint 与启用 MFA 连接起来:

static void Main(string[] args)  
{  
   string siteUrl = "https://<tenant-name>.sharepoint.com/sites/contosoteam";  
   var authManager = new OfficeDevPnP.Core.AuthenticationManager();  
   // This method calls a pop up window with the login page and it also prompts  
   // for the multi factor authentication code.  
   ClientContext ctx = authManager.GetWebLoginClientContext(siteUrl);  
   // The obtained ClientContext object can be used to connect to the SharePoint site.  
   Web web = ctx.Web;  
   ctx.Load(web, w => w.Title);  
   ctx.ExecuteQuery();  
   Console.WriteLine("You have connected to {0} site, with Multi Factor Authentication enabled!!", web.Title);  
}   

您可以使用以下代码下载文件:

Microsoft.SharePoint.Client.File filetoDownload = web.GetFileByServerRelativeUrl("/sites/zellatest/test/Document.docx");
        ctx.Load(filetoDownload);
        ctx.ExecuteQuery();
        var fileRef = filetoDownload.ServerRelativeUrl;
        var fileInfo = Microsoft.SharePoint.Client.File.OpenBinaryDirect(ctx, fileRef);
        var fileName = Path.Combine("C:\\", (string)filetoDownload.Name);

        using (var fileStream = System.IO.File.Create(fileName))
        {
            fileInfo.Stream.CopyTo(fileStream);
        }

更多信息供参考: Using CSOM To Connect To A SharePoint Site With Multi Factor Authentication Enabled

注意:Microsoft 提供此信息是为了方便您。这些站点不受 Microsoft 控制。 Microsoft 无法就此处找到的任何软件或信息的质量、安全性或适用性做出任何陈述。在从上述链接中检索任何建议之前,请确保您完全了解风险。

====================================

如果回答对您有帮助,请点击回答左侧面板的“√”并点赞。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-18
    • 1970-01-01
    相关资源
    最近更新 更多