2010-09-14 8 views
4

J'essaie de télécharger un fichier à partir d'une application C#. J'ai essayé deux méthodes différentes, mais les deux produisent la même réponse: "Le serveur distant a renvoyé une erreur: (401) non autorisé."Problème lors du téléchargement d'un fichier

Je suis assez sûr que c'est un problème d'identification (à cause de la 401). Si je navigue vers l'url à partir d'un navigateur, et entrez les mêmes informations d'identification fournies, le téléchargement du fichier est très bien. Dans "Attempt 2" (ci-dessous), pour authtype, j'ai essayé: NTLM, Basique, Négocier et Digérer sans aucune chance.

Est-ce que quelqu'un voit ce que je peux faire mal ici?

Merci pour l'aide!

Tentative 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"); 

Tentative 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

Dans la tentative n ° 2, le paramètre manuel de l'en-tête semble redondant (même conflictuel) avec l'utilisation de CredentialCache. Ensuite, essayez et devinez les paramètres (avec/sans domaine, Basic/Digest/etcc). Ou, mieux encore, essayez d'utiliser quelque chose comme Fiddler ou Httpwatch pour comprendre quel est le schéma d'authentification utilisé dans le navigateur. –

+0

Amitay, merci. En fait, j'ai essayé avec et sans ça. Je suis d'accord. C'est totalement redondant. Je pense que Fiddler est une excellente idée. Je vais essayer. – RepDetec

Répondre

1

Comme l'a dit Amitay, en utilisant Fiddler pour comparer contre le trafic de navigateur est la meilleure façon d'aller. BTW, regardez here sur SO - ce qui se passe est le cas OP était que la demande était redirigée vers un emplacement différent, mais les informations d'identification n'ont pas été re-passées. Donc OP a fait une redirection manuelle pour résoudre le problème.

0

J'ai vu LL en utilisant sa propre authentification basée sur formulaire ou SSO basée sur IWA. Je ne sais pas si vous pouvez utiliser d'autres types d'authentification HTTP.

Si votre serveur utilise l'authentification de formulaire (par défaut), vous devrez utiliser LAPI ou WS pour télécharger le document en fournissant les informations d'identification LL dans l'appel LAPI/WS. Vous pouvez également obtenir un cookie pour la communication HTTP par LAPI/WS.

Si l'authentification unique est configurée, vous pouvez définir des informations d'identification sur CredentialCache.DefaultCredentials pour transmettre les informations d'identification de la session Windows actuellement authentifiée.

1

Avez-vous essayé

client.UseDefaultCredentials = true 

si vous utilisez MVC ou WebAPI vous devez décorer votre méthode avec

[Authorize] 

Si vous êtes en mesure d'usurper l'identité d'un utilisateur, l'utiliser comme ceci

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); 
     } 
+0

Merci! La suggestion 'client.UseDefaultCredentials = true;' a fonctionné pour moi! –

Questions connexes