我正在尝试使用System.Net.WebClient访问SharePoint列表中的文件。该列表禁用匿名访问(当我们打开它,它工作),我们正在使用基于声明的身份验证。我知道还有其他方法可以访问SharePoint列表中的文件,但这是关于我对Office Web Apps Web服务进行的调用,我必须传递我希望它生成图像的文件的URL。 。使用此URL调用OWA Web服务并尝试通过WebClient直接下载文件都会产生相同的错误。
该错误被禁止403,经过一些谷歌搜索后,我认为原因与使用基于声明的身份验证有某种关系。我已经尝试了一些建议的补救措施,但到目前为止还没有任何效果。我可以使用浏览器访问该文件和Web服务,它在我获得身份验证质询后工作。如果我故意无法通过身份验证质询,我会收到401错误(不是403),所以我不相信凭据有任何问题(我已经做了很多硬编码)。我尝试使用RunWithElevated Privileges运行代码,但这没有帮助。
以下是一些示例代码:
using (var webClient = new WebClient()) { webClient.UseDefaultCredentials = true; byte[] result = webClient.DownloadData(urlOfFileInList); }
感谢任何帮助!
答案 0 :(得分: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);
}
}
}
答案 1 :(得分:0)
使用带有WIF的SharePoint OM,您将获得更好的运气。 这里有一个例子: http://www.shailen.sukul.org/2010/07/adfs-20-and-sharepoint-client-om.html