2011-11-09 9 views
8

Running następujący kod:Podanie nazwy użytkownika i hasła do .NET HttpWebRequest przez URI nie działa

var request = HttpWebRequest.Create("http://username:[email protected]/test-http-status-codes.asp?code=401"); 
var response = request.GetResponse(); 

... i sprawdzeniem żądanie przy użyciu Wireshark wynika, że ​​zezwolenie nie jest próba przez mojego klienta (adres URL jest prosta usługa, która zawsze zwróci 401).

Ten kod wysyła nagłówek autoryzacji po początkowym wyzwanie:

var request = HttpWebRequest.Create("http://username:[email protected]/test-http-status-codes.asp?code=401"); 
request.Credentials = new NetworkCredential("username", "password"); 
var response = request.GetResponse(); 

Korzystanie klasa System.Uri nie ma żadnego wpływu. Dlaczego nazwa użytkownika i hasło są przekazywane w adresie URL nieużywanym do uwierzytelniania?

(Jestem świadomy this blog post na przejściu nagłówek autoryzacji bez wstępnej wyzwanie, ale to nie jest problem pod ręką)

EDIT należy dodać, że jest to dość łatwe do obejścia tego ograniczenia na przykład z tego kawałka kodu (dodaj url un-ucieczce do smaku), jestem tylko ciekaw, dlaczego trzeba to zrobić:

var userInfo = request.Address.UserInfo; 
if (!string.IsNullOrEmpty(userInfo) && userInfo.Contains(':')) 
{ 
    request.Credentials = new NetworkCredential(userInfo.Split(':').First(), userInfo.Split(':').Last()); 
} 

Odpowiedz

3

Klasa HttpWebRequest nie wykorzystuje poświadczenia w Uri (za dotPeek).

Ale FtpWebRequest robi, tutaj jest odpowiedni kod:

if (this.m_Uri.UserInfo != null && this.m_Uri.UserInfo.Length != 0) 
    { 
    string userInfo = this.m_Uri.UserInfo; 
    string userName = userInfo; 
    string password = ""; 
    int length = userInfo.IndexOf(':'); 
    if (length != -1) 
    { 
     userName = Uri.UnescapeDataString(userInfo.Substring(0, length)); 
     int startIndex = length + 1; 
     password = Uri.UnescapeDataString(userInfo.Substring(startIndex, userInfo.Length - startIndex)); 
    } 
    networkCredential = new NetworkCredential(userName, password); 
    } 

Jak widać to właśnie dołącza go do mandatów, więc należy po prostu zrobić zamiast ręcznie z analizowany Uri

+0

Tak, Mam podobny kod - po prostu nie rozumiem, dlaczego HttpWebRequest ignoruje to ... – friism

+1

Myślę, że z powodu tego, że jest to problem związany z bezpieczeństwem. Wiele przeglądarek ignoruje to również: http://support.microsoft.com/kb/834489 Będę musiała wrócić do poprzednich wersji .NET, aby sprawdzić, czy kiedykolwiek było to zakodowane, ale wyraźnie nie w 4.0 –

Powiązane problemy