2009-07-29 61 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では、デフォルトの資格情報が提供されます。

したがって、IE設定から.NETが継承されても、IEで実行されている場合を除き、Basic/Digestのプロキシ認証はサポートされません。ユーザーにプロンプ​​トを表示するか、設定画面を提供する必要があります。

Fiddler(www.fiddler2.com)は、このシナリオをテストするためにシミュレートするために使用できる[Rules]メニューの[Request Proxy Authentication]オプションを備えています。

+2

ありがとうエリック。フィドラーはうまくいく。 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 =新しいCredentialCache();cache.Add(新しいUri(url)、 "Basic"、新しいNetworkCredential( "1"、 "1")); webClient.Proxy.Credentials = credentialCache; webClient.Credentials = credentialCache; 文字列contents = webClient.DownloadString(url); – Daniel

+1

これは機能しています。何らかの理由でCredentialCacheが機能しませんでした。私はwebClient.Proxy.CredentialsにNetworkCredentialを渡さなければなりませんでした。 – Daniel

6

「プロキシを使用する」を選択するための設定ダイアログを追加することで、この問題を解決しました。 この設定を行うと、これらのパラメータ(アドレス、資格情報...)が使用されます。 もしそうでなければ、私たちは手動でのやりとりなしに接続ができると仮定します。エラーの場合は 我々はやる: ) B既定の資格情報を使用して再試行してください)configに設定が助けることができるという情報をポップアップ...

プロキシ認証は、「既定の資格情報」を介して行われている場合。 (Windowsユーザー)IEはまた、認証エラーに反応し、この場合にはデフォルトの資格情報を送信します。 これが機能しない場合は、資格情報ダイアログが開きます。 すべてのブラウザがこのように処理するかどうかはわかりませんが、単にフィドラーを使って試してみると、何が起こっているのかを確認できます。

+0

詳細なワークフローに感謝します。 –

6

私はこれが古い投稿だと知っていますが、WebクライアントをSSIS 2008R2(SQL Server Integration Services)スクリプトタスク(VB.NETコード)でプロキシサーバー経由で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)