我正在尝试从C#应用程序下载文件。我尝试了两种不同的方法,但两者都产生相同的响应: “远程服务器返回错误:(401)未经授权。”
我很确定这是凭证问题(因为401)。如果我从浏览器导航到该URL并输入所提供的相同凭据,则该文件下载得很好。在“尝试2”(下面)中,对于authtype,我尝试过: NTLM,Basic,Negotiate和Digest没有任何运气。
有谁看到我在这里做错了什么?
感谢您的帮助!
尝试1:
string username = "username";
string password = "password";
string domain = "domain";
string url = @"http://LiveLinkInstance.com/livelink/llisapi.dll/999999/WordDocument.docx?func=doc.Fetch&nodeid=999999&ReadOnly=True&VerNum=-2&nexturl=/livelink/llisapi.dll?func=ll&objId=888888&objAction=browse&viewType=1";
// Create an instance of WebClient
WebClient client = new WebClient();
client.Proxy = null;
client.Credentials = new System.Net.NetworkCredential(username, password, domain);
client.DownloadFile(new Uri(url), @"C:\FileDownloads\test.txt");
尝试2:
string username = "username";
string password = "password";
string domain = "domain";
string url = @"http://LiveLinkInstance.com/livelink/llisapi.dll/999999/WordDocument.docx?func=doc.Fetch&nodeid=999999&ReadOnly=True&VerNum=-2&nexturl=/livelink/llisapi.dll?func=ll&objId=888888&objAction=browse&viewType=1";
HttpWebRequest wr = (HttpWebRequest)WebRequest.Create(url);
string credentials = Convert.ToBase64String(ASCIIEncoding.ASCII.GetBytes(domain + "\\" + username + ":" + password));
wr.Headers.Add("Authorization", "Basic " + credentials);
CredentialCache cc = new CredentialCache();
cc.Add(new Uri(url), "NTLM", new NetworkCredential(username, password, domain));
wr.Credentials = cc;
Stream str = ws.GetResponseStream();
答案 0 :(得分:1)
正如Amitay所说,使用fiddler来比较来自浏览器的流量是最好的方法。顺便说一句,看看here就是这样 - OP的情况是,请求被重定向到不同的位置,但凭证没有被重新传递。所以OP做了手动重定向来解决问题。
答案 1 :(得分:1)
你试过吗
client.UseDefaultCredentials = true
如果您使用的是MVC或WebApi,则应使用
修饰您的方法[Authorize]
如果您能够模仿用户,请像这样使用
WindowsIdentity wi = null;
wi = (WindowsIdentity)HttpContext.Current.User.Identity;
using (wi.Impersonate())
{
var client = new WebClient { UseDefaultCredentials = true };
client.Headers.Add(HttpRequestHeader.ContentType, "application/json; charset=utf-8");
var result = JsonConvert.DeserializeObject<Object>(Encoding.UTF8.GetString(client.DownloadData("http://api.com/api/values")));
return Request.CreateResponse(result);
}
答案 2 :(得分:0)
我看到LL使用自己的基于表单的身份验证或基于IWA的SSO。我不知道你是否可以使用其他HTTP身份验证类型。
如果您的服务器使用(默认)表单身份验证,则必须使用LAPI或WS下载文档,以提供LAPI / WS调用中的LL凭据。您也可以通过LAPI / WS获取用于HTTP通信的cookie。
如果已配置SSO,则可以将凭据设置为CredentialCache.DefaultCredentials以传入当前已验证的Windows会话的凭据。