WebClient凭据SharePoint Intranet

时间:2012-07-11 18:40:43

标签: c# asp.net sharepoint authentication webclient

我正在解决一个问题,它涉及从我们的LAN SharePoint服务器下载多个PDF文件到我们的DMZ。

我们要完成的是“NewsFeed”类型的应用程序。它的作用是从SharePoint中制作的上传内容类型中获取列表数据,然后将它们发布到DMZ上托管的外部网站,并附带相应pdf文件的链接。我们使用了sharepoint相当容易完成文本布局的REST API,但我们现在遇到的问题是将上传文档的.pdf从SharePoint站点复制到DMZ上,因此我们可以将它们存储在缓存中,用户可以通过href访问它们。

以下代码可用于访问SharePoint REST API。

        // Create the connection to sharepoint.  Credentials are managed within web.config
        SharePointListsREST.SharePointDataContext dc = new SharePointListsREST.SharePointDataContext(new Uri(ConfigurationManager.AppSettings["spUrl"]));
        CredentialCache cc = new CredentialCache();
        cc.Add(new Uri(ConfigurationManager.AppSettings["spUrl"]), "NTLM", new NetworkCredential(ConfigurationManager.AppSettings["spUser"], ConfigurationManager.AppSettings["spPassword"], ConfigurationManager.AppSettings["spDomain"]));
        dc.Credentials = cc;

这非常有效,它能够进行身份验证,获取数据并显示数据。对于PDF下载功能,我们有这个。

    private void GetPDF(string URL, string path)
    {
        if (System.IO.File.Exists(path))
            System.IO.File.Delete(path);
        WebClient wc = new WebClient();
        CredentialCache cc = new CredentialCache();
        cc.Add(new Uri(ConfigurationManager.AppSettings["spUrl"]), "NTML", new NetworkCredential(ConfigurationManager.AppSettings["spUser"], ConfigurationManager.AppSettings["spPassword"], ConfigurationManager.AppSettings["spDomain"]));

        wc.Credentials = cc;

        wc.DownloadFile(URL, path);
    } 

根本不起作用并抛出401 Not Authorized错误。但是,如果您尝试通过转到http://XX.XX.XX.XX/.../test.pdf来访问pdf文件,系统将提示您输入用户名/密码。输入我的基于Windows的凭据将允许我访问pdf。

我尝试过使用wc.UseDefaultCredentials = true;,但它也不起作用。有没有人对如何使用webclient有任何想法?

以下是IIS中的错误日志之一。

2012-07-11 00:56:12 XX.XX.XX.XX GET /Employee+Images/_t/sample.jpg - 80 - 192.168.200.12 - 401 2 5 0

1 个答案:

答案 0 :(得分:0)

在SharePoint网站上使用Windows身份验证时,可以选择模拟用户并在模拟块中运行整个WebClient代码。

关于冒充用户,请参阅此问题How can I use Directory.CreateDirectory with a different user id?

或者您只需使用Runas作为特殊用户运行整个过程 - 无需更改代码。