Windows HTTP 프록시의 흥미로운 사례

라이언블로그포스트 (1)
웹은 요즘 대부분의 애플리케이션에서 선호되는 전달 메커니즘이지만 고객이 사용할 CLI 또는 데스크톱 애플리케이션을 구축하려는 시나리오가 있습니다. 그러나 일단 브라우저의 안락한 범위를 벗어나면 일반적인 회사 네트워크 내에서 실행해야 하는 경우 열악한 응용 프로그램을 처리해야 하는 수많은 프록시 구성이 있습니다.
이 게시물의 목적에 따라 "일반적인 회사 네트워크"는 사용자가 특정 Windows 버전을 실행하고 인증 HTTP 프록시 뒤에 앉아 있음을 의미합니다. 이는 매우 일반적인 설정처럼 보이지만 놀라울 정도로 많은 응용 프로그램이 이 환경에서 작동하지 않습니다.
다행히 .NET 애플리케이션을 작성할 때 기본 설정을 사용하면 대부분 무료로 사용할 수 있습니다. 기본 웹 프록시는 사용자가 IE에서 구성한 프록시 설정을 자동으로 사용합니다. 가능하다면 이것이 당신이 의지해야 할 것입니다. 사용자가 애플리케이션에 전달할 수 있는 프록시 호스트 이름 및 포트 구성 값을 노출하고 싶은 유혹이 있지만 어떤 경우에는 기업 사용자가 사용할 잘 알려진 프록시가 하나도 없을 수도 있습니다. WPAD 및 PAC 파일을 사용하면 프록시를 동적으로 구성할 수 있습니다. 보다 이 게시물에 자세한 내용은
안타깝게도 기본 설정에서는 기본적으로 인증을 처리하지 않습니다. 웹 요청은 일반적으로 407 ProxyAuthenticationRequired 오류로 인해 실패합니다. 다음 단계는 반환된 프록시 인증 응답 헤더를 검사하여 프록시가 수락하는 인증 유형을 확인하는 것입니다. 일반적으로 이는 기본, 다이제스트, NTLM 또는 협상의 조합입니다. 프록시가 NTLM 또는 Negotiate를 지원하는 경우 설명된 대로 app.config에 useDefaultCredentials=true 속성을 추가하기만 하면 애플리케이션을 실행하는 로그인한 사용자를 자동으로 인증할 수 있습니다. 여기에서 지금 확인해 보세요.:

 

이는 애플리케이션 코드를 수정하거나 자격 증명 관리를 처리하는 골치 아픈 일을 처리할 필요가 없기 때문에 특히 좋습니다. 아쉽게도 프록시가 기본 또는 다이제스트 인증을 사용하도록 구성된 경우에는 작동하지 않습니다. 이것은 특이한 설정이지만, 야생에서 자주 접하게 될 것입니다. 이 경우 사용자 이름과 비밀번호를 읽은 다음 이를 IWebProxy.Credentials 속성에 저장하는 방법이 필요합니다. 지적했듯이 여기에서 지금 확인해 보세요., 이 설정은 프록시 자격 증명을 관리하기 위해 모든 애플리케이션에 부담을 주기 때문에 일반적으로 사용되지 않습니다.
C#에서는 app.config에 구성된 기본 프록시 설정이 WebRequest.DefaultWebProxy 정적 변수에 반영됩니다. 자격 증명을 직접 수정하는 것보다 읽기 요청을 통과하지만 기본 프록시를 건드리지 않고 자체 자격 증명 세트를 관리하는 프록시용 데코레이터를 만드는 것이 더 깔끔합니다.

공용 클래스 ProxyWrapper: IWebProxy { 개인 읽기 전용 IWebProxy _proxy; 공개 ProxyWrapper(IWebProxy 프록시) { _proxy = 프록시; } 공개 ICredentials 자격 증명 { get; 세트; } 공개 Uri GetProxy(Uri 대상) { return _proxy.GetProxy(대상); } public bool IsBypassed(Uri 호스트) { return _proxy.IsBypassed(host); } }

그런 다음 다음과 같은 작업을 수행하여 사용자 정의 자격 증명으로 기본 프록시 설정을 사용할 수 있습니다.

// 이를 읽는 방법은 애플리케이션 문자열에 따라 다릅니다. 사용자 이름 = ... SecureString 비밀번호 = ... IWebProxy 프록시 = new ProxyWrapper(WebRequest.DefaultWebProxy); Proxy.Credentials = new NetworkCredential(사용자 이름, 비밀번호); WebRequest.DefaultWebProxy = 프록시;

이를 통해 app.config에 구성된 원래 자격 증명으로 쉽게 다시 전환하거나 필요에 따라 다른 세트를 사용할 수 있습니다.
.NET을 사용하는 사람들에게는 이 모든 것이 매우 간단하지만 다른 언어에서 사용되는 http 라이브러리에서 인증 프록시(특히 NTLM 및 Negotiate만 사용하는 프록시)를 지원하는 것은 쉽지 않을 수 있습니다. 이러한 시나리오에서 일부 사람들은 다음을 사용하여 성공했습니다. cntlm 인증 프록시의 프록시로 사용됩니다.
핵심요약: .NET에서 애플리케이션을 작성하는 사람들은 app.config 파일에 useDefaultCredentials=true를 설정하면 대부분의 경우 "제대로 작동"할 것입니다.

비슷한 게시물