1

我正在尝试使用 System.Net.WebClient 访问 SharePoint 列表中的文件。该列表禁用了匿名访问(当我们打开它时,它可以工作)并且我们正在使用基于声明的身份验证。我知道还有其他方法可以访问 SharePoint 列表中的文件,但这是关于我对 Office Web Apps Web 服务的调用,在该服务中我必须传递我希望它生成图像的文件的 URL . 使用此 URL 调用 OWA Web 服务并尝试通过 WebClient 直接下载文件都会产生相同的错误。

该错误是 403 被禁止的,经过一番谷歌搜索后,我认为原因与使用基于声明的身份验证有关。我已经尝试了一些建议的补救措施,但到目前为止没有任何效果。我可以使用浏览器访问文件和 Web 服务,并且在我收到身份验证挑战后它可以工作。如果我故意未能通过身份验证质询,我会收到 401 错误(不是 403),所以我不认为凭据有任何问题(我已经对它们进行了硬编码)。我尝试使用 RunWithElevated Privileges 运行代码,但这无济于事。

这是一些示例代码:

    使用 (var webClient = new WebClient())
    {
    webClient.UseDefaultCredentials = true;
    字节[] 结果 = webClient.DownloadData(urlOfFileInList);
    }

任何帮助表示赞赏!

4

2 回答 2

1

您可能必须使用 WebClient 进行声明登录,看看您是否可以以此为起点。

    using (var webClient = new WebClient()) {
        string url = "http://yoursite";
        string result = null;
        try {
            result = webClient.DownloadString(url);
        } catch (Exception ex) {
            if (ex.ToString().Contains("403")) {
                result = webClient.DownloadString(url + "/_forms/default.aspx");
                string viewstate = result.Substring(result.IndexOf("__VIEWSTATE") + 11);
                viewstate = viewstate.Substring(viewstate.IndexOf("value=\"") + 7);
                viewstate = viewstate.Substring(0, viewstate.IndexOf("\""));
                string eventvalidation = result.Substring(result.IndexOf("__EVENTVALIDATION") + 17);
                eventvalidation = eventvalidation.Substring(eventvalidation.IndexOf("value=\"") + 7);
                eventvalidation = eventvalidation.Substring(0, eventvalidation.IndexOf("\""));
                System.Collections.Specialized.NameValueCollection values = new System.Collections.Specialized.NameValueCollection();
                values.Add("__EVENTARGUMENT", "");
                values.Add("__EVENTTARGET", "");
                values.Add("__EVENTVALIDATION", eventvalidation);
                values.Add("__LASTFOCUS", viewstate);
                values.Add("__VIEWSTATE", "");
                values.Add("ctl00$PlaceHolderMain$signInControl$UserName", "");
                values.Add("ctl00$PlaceHolderMain$signInControl$login", "Sign In");
                values.Add("ctl00$PlaceHolderMain$signInControl$password", "");
                //byte[] data = webClient.UploadValues(url + "/_forms/default.aspx", "POST", values);
                //result = System.Text.Encoding.Default.GetString(data);
                //result = webClient.UploadString(url + "/_forms/default.aspx?__EVENTARGUMENT=&__EVENTTARGET=&__EVENTVALIDATION=" + 
                //    eventvalidation + "&__LASTFOCUS=&__VIEWSTATE=" + viewstate + 
                //    "&ctl00$PlaceHolderMain$signInControl$UserName=&ctl00$PlaceHolderMain$signInControl$login=Sign+In&ctl00$PlaceHolderMain$signInControl$password=", "");
                string location = webClient.ResponseHeaders["Location"];
                result = webClient.DownloadString(url);
            }
        }
    }
于 2011-01-15T05:32:28.167 回答
0

使用带有 WIF 的 SharePoint OM 会有更好的运气。此处提供了一个示例:http: //www.shailen.sukul.org/2010/07/adfs-20-and-sharepoint-client-om.html

于 2011-01-15T06:42:57.297 回答