Проблемы с загрузкой файла - PullRequest
4 голосов
/ 14 сентября 2010

Я пытаюсь загрузить файл из приложения C #.Я пробовал два разных метода, но оба дают один и тот же ответ: «Удаленный сервер возвратил ошибку: (401) Несанкционировано».

Я почти уверен, что это проблема с учетными данными (из-за 401).Если я перейду к URL-адресу из браузера и введу те же данные, что и предоставленные учетные данные, файл загрузится просто отлично.В «Попытке 2» (ниже) для аутентификации я попытался: 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();

Ответы [ 3 ]

1 голос
/ 09 июля 2015

Вы пробовали

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);
       }
1 голос
/ 14 сентября 2010

Как сказал Amitay, использование fiddler для сравнения с трафиком из браузера является лучшим способом.Кстати, посмотрите здесь на SO - то, что происходит, - это случай OP, когда запрос перенаправлялся в другое место, но учетные данные не были повторно переданы.Поэтому OP сделал ручное перенаправление, чтобы решить проблему.

0 голосов
/ 11 февраля 2012

Я видел LL, использующий собственную аутентификацию на основе форм или SSO на основе IWA.Я не знаю, можете ли вы использовать другие типы аутентификации HTTP.

Если ваш сервер использует аутентификацию формы (по умолчанию), вам придется использовать LAPI или WS, чтобы загрузить документ, предоставляющий учетные данные LL в LAPI /WS звонок.Вы также можете просто получить cookie для HTTP-связи по протоколу LAPI / WS.

Если у вас настроен SSO, вы можете установить Credentials в CredentialCache.DefaultCredentials, чтобы передавать учетные данные текущего аутентифицированного сеанса Windows.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...