2009-07-29 2 views
12

System.Net.WebClient 클래스를 사용할 때 프록시 인증 오류 (HTTP 407 상태 코드)를 강력하게 처리하는 방법을 알아 내려고하고 있습니다.System.Net.WebClient 대 프록시 인증 407 오류

이 필드에서는 많은 사용자가 4035 프록시 인증 WebException을 수신하는 것으로 나타 났지만 좋은 기본 전략이 무엇인지 잘 모르겠습니다. .Net 2.0/3.5에서 프록시 인증 설정은 Internet Explorer 시스템 설정에서 상속 된 것으로 간주됩니다. Firefox, Opera 및 Chrome은 동일한 설정을 사용합니다.

가 여기에 우리가 사용하는 기본 코드입니다 :이 코드가 실패하면

using System.Net; 

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

, 우리는 사용자의 브라우저를 열고 도움말 페이지로 보냅니다. 웹 로그를 통해이 고객이 브라우저 에 성공적으로 연결할 수 있음을 알게되었습니다. Google 도움말 페이지를보기 전에 수동으로 프록시 사용자 이름과 비밀번호를 입력하는 것일 수도 있습니다. 우리는 모른다.

WebClient.UseDefaultCredentials를 사용할 수있는 것처럼 보이지만 WebClient가 시스템 설정을 사용하는 경우이 은 중복 된 것처럼 보입니다.

도움을 주시면 감사하겠습니다.

답변

11

프록시 인증에서 BASIC 또는 DIGEST를 사용하는 경우 Internet Explorer에서 프록시 인증 자격 증명을 지속적으로 캐시/재사용하지 않습니다. Negotiate/NTLM의 경우 기본 자격 증명이 제공됩니다.

따라서 .NET에서 IE 설정을 상속 받더라도 Internet Explorer에서 실행되지 않는 한 기본/다이제스트에 대한 프록시 인증을 "무료"로 지원하지 않습니다. 사용자에게 메시지를 보내거나 구성 화면을 제공해야합니다.

Fiddler (www.fiddler2.com)는 테스트 시나리오를 시뮬레이션하는 데 사용할 수있는 규칙 메뉴의 "프록시 인증 요청"옵션을 가지고 있습니다.

+2

감사합니다. Eric. 피들러는 잘 작동합니다. Negotiate/NTML에 대해 설명하기 위해 UseDefaultCredentials = true로 설정했는지 여부에 관계없이 WebClient에서 기본 자격 증명을 제공합니까? 즉, 407 WebException을 처리하고 UseDefaultCredentials = true를 사용하여 다시 시도 할 때 가치가 있습니까? 왜 항상 UseDefaultCredentials = true를 설정하지 않는가? 보안 위험? 의견 면책 조항 : WinInet이이 점을 훨씬 능가하는 것으로 보입니다. 우주의 모든 사람들이 프록시를 통과하기를 원한다면 자동으로이 작업을 수행하거나 이벤트를 실행하고 자격 증명을 입력/저장하기위한 표준 UI를 제공하는 것이 어떻겠습니까? – Daniel

+0

나는 Fiddler와 함께 더 많은 것을 실험했다. 나는 아래와 같이 사용자 이름과 암호 ("1", "1")를 제공하는 것이 쉬울 것이라고 생각했지만 작동하지 않습니다. string url = "http://www.java.com/"; webClient = new WebClient(); CredentialCache cache = new CredentialCache(); cache.Add (새 Uri (url), "Basic", 새 NetworkCredential ("1", "1")); webClient.Proxy.Credentials = credentialCache; webClient.Credentials = credentialCache; 문자열 내용 = webClient.DownloadString (url); – Daniel

+1

제대로 작동합니다. 어떤 이유로 CredentialCache가 작동하지 않습니다. webClient.Proxy.Credentials에 NetworkCredential을 전달해야했습니다. – Daniel

6

"프록시 사용"을 선택할 수있는 설정 대화 상자를 추가하여이 문제를 해결했습니다. 이 설정을 완료하면이 매개 변수 (주소, 자격 증명 ...)를 사용합니다. 그렇지 않은 경우 수동으로 연결하지 않고 연결할 수 있다고 가정합니다. 오류의 경우 우리가 할 : A)를 B 기본 자격 증명을 사용하여 다시 시도) 설정에서 설정이 도움이 될 수 있다는 정보를 팝업 ...

프록시 인증이 "기본 자격 증명"을 통해 수행됩니다.. (Windows 사용자) IE는 또한 인증 오류에 대응하고이 경우 기본 자격 증명을 보냅니다. 이것이 작동하지 않으면 자격 증명 대화 상자가 열립니다. 모든 브라우저에서이 방법으로 처리 할 수 ​​있을지는 잘 모르겠지만, 단순히 바이올린을 사용하여 시도해 볼 수는 있습니다. 따라서 진행 상황을 볼 수 있습니다.

+0

세부 워크 플로에 감사드립니다. –

6

이 게시물은 오래되었지만 원격 서버에 프록시 서버를 통해 SSIS 2008R2 (SQL Server Integration Services) 스크립트 작업 (VB.NET 코드)에서 WebClient를 사용하여 XML 파일을 다운로드하려고하는 비슷한 문제가있었습니다. 또한 인증이 필요한 SSL을 통해 보안이 설정된 사이트.

해결책을 찾기 위해 잠시 시간을 들였고이 게시물은 프록시 측에서 도움이되었습니다. 아래 스크립트 코드는 나를 위해 일했습니다. 유사하게 검색하는 사용자에게 유용 할 수 있습니다.

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) 
관련 문제