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());
}
Tak, Mam podobny kod - po prostu nie rozumiem, dlaczego HttpWebRequest ignoruje to ... – friism
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 –