2009-04-26 25 views
12

Próbuję pobrać niektóre dane z wystąpienie usług raportowania na naszym serwerze TFS.
Biorąc pod uwagę, że kod powinien działać na komputerze, który nie jest połączony z domeną, uznałem, że sam ustawię poświadczenia. Bez powodzenia, otrzymałem nieautoryzowany HTTP 401 z powrotem. Ok, więc podłączyłem Fiddlera, żeby zobaczyć, co się dzieje.System.Net.WebClient nie udaje się dziwnie

Ale wtedy otrzymałem Heisenberged - połączenie zostało wykonane bez żadnych problemów. Tak więc uwierzytelnienie przechodzi z Fiddler podłączony, ale nie bez niego. Czy Webclient jest zepsuty, czy też brakuje mi czegoś głębokiego?

private void ThisWorksWhenDomainJoined() 
    { 
     WebClient wc = new WebClient(); 
     wc.Credentials = CredentialCache.DefaultNetworkCredentials; 
     wc.DownloadString("http://teamfoundationserver/reports/........"); //Works 
    } 

    private void ThisDoesntWork() 
    { 
     WebClient wc = new WebClient(); 
     wc.Credentials = new NetworkCredential("username", "password", "domain"); 
     wc.DownloadString("http://teamfoundationserver/reports/........"); //blows up wih HTTP 401 
    } 
+11

+1 za pomocą uncertaintly zasadę Heisenberga jako czasownik, nigdy wcześniej nie słyszał, że jeden! –

Odpowiedz

4

Spójrz na ten link:
HTTP Authorization and .NET WebRequest, WebClient Classes

miałem ten sam problem jak ty. Dodałem tylko jedną linię i zaczęło działać. Spróbuj tego

private void ThisDoesntWork() 
    { 
     WebClient wc = new WebClient(); 
     wc.Credentials = new NetworkCredential("username", "password", "domain"); 
     //After adding the headers it started to work ! 
     wc.Headers.Add(HttpRequestHeader.UserAgent, "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)"); 
     wc.DownloadString("http://teamfoundationserver/reports/........"); //blows up wih HTTP 401 
    } 
+0

dodanie linii nagłówków działało dobrze dla mnie! – viperguynaz

1

Co dzieje się, gdy używasz tego?

wc.Credentials = CredentialCache.DefaultCredentials; 

Jesteś pewny, że posiadasz poprawną nazwę użytkownika, hasło i domenę?

Ponadto: Zastanawiam się, czy Fiddler zmienia się wokół niektórych znaków unicode, gdy .net je łamie lub coś w tym stylu. Jeśli twój użytkownik/hasło/domena ma kod Unicode, spróbuj go wydostać jak "\u2638" zamiast "☺".

+3

Podczas pracy nad podobnym problemem ze współpracownikiem ustaliliśmy, że skrzypek uzyskuje dostęp do usługi sieciowej przy użyciu lokalnych poświadczeń, gdzie kod w aplikacji Asp.Net używałby poświadczeń użytkownika asp.net, które najprawdopodobniej nie są dostępne. t mają uprawnienia. – travis

2

Spróbuj tego ...

var credCache = new CredentialCache(); 
credCache.Add(new Uri("http://teamfoundationserver/reports/........""), 
         "Basic", 
         new NetworkCredential("username", "password", "DOMAIN")); 
wc.Credentials = credCache; 

Jeśli to nie zadziała, spróbuj wymienić "Basic" z "Negocjuj".

1

udało mi się ominąć ten błąd za pomocą obiektu CredentialCache, co następuje:

WebClient wc = new WebClient(); 
CredentialCache credCache = new CredentialCache(); 
credCache.Add(new Uri("http://mydomain.com/"), "Basic", 
new NetworkCredential("username", "password")); 

wc.Credentials = credCache; 

wc.DownloadString(queryString));