2009-07-29 4 views
12

Próbuję dowiedzieć się, jak skutecznie obsługiwać błędy uwierzytelniania proxy (HTTP 407 kod stanu) podczas korzystania z klasy System.Net.WebClient.Błąd System.Net.WebClient vs. Proxy Authentication 407

W terenie widzimy wielu użytkowników otrzymujących uwierzytelnienie proxy 402 w standardzie WebException, ale nie jestem pewien, jaka jest dobra strategia domyślna. W .Net 2.0/3.5 ustawienia autoryzacji proxy mają być dziedziczone po ustawieniach systemu Internet Explorer. Firefox, Opera i Chrome korzystają z tych samych ustawień, co .

Oto kod podstawowy używamy:

using System.Net; 

string url = "http://www.mysite.com"; 
WebClient webClient = new WebClient(); 
byte[] data = webClient.DownloadFile(url); 

Gdy ten kod nie powiedzie, otwieramy przeglądarkę użytkownika i przesyła je do pomocy stronie. Z naszych dzienników internetowych wiemy, że ci klienci mogą z powodzeniem łączyć się w swoich przeglądarkach pod numerem . Być może ręcznie wprowadzają swoją nazwę użytkownika proxy i hasło zanim przejdą na naszą stronę pomocy? Nie wiemy.

Wygląda na to, że możemy użyć WebClient.UseDefaultCredentials, ale ten wydaje się zbędny, jeśli WebClient i tak używa ustawień systemowych.

Każda pomoc jest doceniana.

Odpowiedz

11

Program Internet Explorer nie buforuje/nie wykorzystuje po raz kolejny danych uwierzytelniających proxy, jeśli autoryzacja proxy używa BASIC lub DIGEST. W przypadku Negotiate/NTLM zostaną podane domyślne dane uwierzytelniające.

Dlatego nawet jeśli .NET dziedziczy z ustawień IE, nie otrzymasz żadnej "darmowej" obsługi autoryzacji proxy dla Basic/Digest, chyba że działasz w IE; będziesz musiał zapytać użytkownika lub podać ekran konfiguracji.

Fiddler (www.fiddler2.com) ma opcję "Request Proxy Authentication" w menu Rules, której można użyć do symulacji tego scenariusza do testowania.

+2

Dzięki Eric. Fiddler działa dobrze. Aby wyjaśnić, dla Negotiate/NTML, domyślne poświadczenia będą dostarczane przez WebClient niezależnie od tego, czy ustawię UseDefaultCredentials = true? Innymi słowy, czy istnieje wartość w obsłudze 407 wyjątku WebException i ponownej próbie z UseDefaultCredentials = true? Dlaczego po prostu nie zawsze ustawić UseDefaultCredentials = true? Zagrożenie dla bezpieczeństwa? Opinia Oświadczenie: Wydaje się, że WinInet radzi sobie z tym znacznie lepiej. Biorąc pod uwagę, że wszyscy we wszechświecie chcą przemierzać serwery proxy, dlaczego nie zrobić tego automatycznie lub nie wystrzelić zdarzenia i zapewnić standardowy interfejs do wprowadzania/zapisywania danych uwierzytelniających? – Daniel

+0

Bardziej eksperymentowałem z Fiddler. Myślałem, że łatwo będzie podać nazwę użytkownika i hasło ("1", "1") jak poniżej, ale to nie działa. string url = "http://www.java.com/"; webClient = new WebClient(); Pamięć podręczna CredentialCache = new CredentialCache(); cache.Add (nowe Uri (url), "Basic", new NetworkCredential ("1", "1")); webClient.Proxy.Credentials = credentialCache; webClient.Credentials = credentialCache; treść ciągu = webClient.DownloadString (url); – Daniel

+1

Gotowy do pracy. Z jakiegoś powodu CredentialCache nie działał. Musiałem przekazać NetworkCredential do webClient.Proxy.Credentials. – Daniel

6

Rozwiązaliśmy ten problem, dodając okno dialogowe konfiguracji, które pozwala użytkownikowi wybrać "użyj proxy". Po dokonaniu tego ustawienia używamy tych parametrów (adres, poświadczenia ...). Jeśli nie - zakładamy, że połączenie może zostać nawiązane bez jakiejkolwiek ręcznej interakcji. W przypadku wystąpienia błędu robimy: a) spróbuj ponownie używając domyślnych poświadczeń b) popup informację, że ustawienie w config mogłyby pomóc ...

Jeśli uwierzytelnianie proxy odbywa się poprzez „poświadczeń domyślnych”.. (Użytkownik Windows) IE reaguje również na błąd auth i wysyła domyślne dane uwierzytelniające w tym przypadku. Jeśli to nie zadziała, otworzy okno dialogowe poświadczeń. Nie jestem pewien, czy wszystkie przeglądarki radzą sobie z tym w ten sposób - ale możesz po prostu spróbować za pomocą skrzypka, żebyś mógł zobaczyć, co się dzieje.

+0

dzięki za szczegółowy przebieg pracy. –

6

Wiem, że to stary post, ale miałem podobny problem, próbując pobrać plik XML, używając WebClient w zadaniu skryptowym SSIS 2008R2 (SQL Server Integration Services) (kod VB.NET) za pośrednictwem serwera proxy do zdalnego witryna zabezpieczona za pomocą protokołu SSL, która wymagała również uwierzytelnienia.

Zajęło trochę czasu, aby znaleźć rozwiązanie, a ten post pomógł po stronie proxy. Poniżej znajduje się kod skryptu, który zadziałał dla mnie. Może być użyteczny dla kogoś, kto szuka czegoś podobnego.

Dim objWebClient As WebClient = New WebClient() 
    Dim objCache As New CredentialCache() 

    'https://www.company.net/xxxx/resources/flt 
    Dim strDownloadURL As String = Dts.Variables("FileURL").Value.ToString 

    '[email protected] 
    Dim strLogin As String = Dts.Variables("FileLogin").Value.ToString 

    'sitepassword 
    Dim strPass As String = Dts.Variables("FilePass").Value.ToString 

    'itwsproxy.mycompany.com 
    Dim strProxyURL As String = Dts.Variables("WebProxyURL").Value.ToString 

    '8080 
    Dim intProxyPort As Integer = Dts.Variables("WebProxyPort").Value 

    'Set Proxy & Credentials as a Network Domain User acc to get through the Proxy 
    Dim wp As WebProxy = New WebProxy(strProxyURL, intProxyPort) 
    wp.Credentials = New NetworkCredential("userlogin", "password", "domain") 
    objWebClient.Proxy = wp 

    'Set the Credentials for the Remote Server not the Network Proxy 
    objCache.Add(New Uri(strDownloadURL), "Basic", New NetworkCredential(strLogin, strPass)) 
    objWebClient.Credentials = objCache 

    'Download file, use Flat File Connectionstring to save the file 
    objWebClient.DownloadFile(strDownloadURL, Dts.Connections("XMLFile").ConnectionString)