31

私はそれがすぐに認証情報を要求しますページを開こうとする場合、私は、ブラウザで、すなわち、認証が必要なプロキシで働いています。自分のプログラムで同じ資格情報を提供しましたが、HTTP 407エラーで失敗します。私はすべての可能なものを試してみましたが、私は何かが欠けていますように見えるしているプロキシ基本認証:HTTP 407エラー

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(URL); 

IWebProxy proxy = WebRequest.GetSystemWebProxy(); 
CredentialCache cc = new CredentialCache(); 
NetworkCredential nc = new NetworkCredential(); 

nc.UserName = "userName"; 
nc.Password = "password"; 
nc.Domain = "mydomain"; 
cc.Add("http://20.154.23.100", 8888, "Basic", nc); 
proxy.Credentials = cc; 
//proxy.Credentials = System.Net.CredentialCache.DefaultCredentials; 
request.Proxy = proxy; 
request.Proxy.Credentials = cc; 
request.Credentials = cc; 
request.PreAuthenticate = true; 

は、ここに私のコードです。 は、それが何かのように、私は2つの要求をしなければならないですか?最初に資格情報を出して、資格情報の必要性についてサーバーから聞いたら、資格情報で同じ要求をしますか?

+0

?基本? NTLM? –

+0

ベーシックなので、私は信用キャッシュでBasicを使用しています... – rplusg

答えて

17

ここcredsを一緒にプロキシを使用する正しい方法は..です助けを

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(URL); 

IWebProxy proxy = request.Proxy;      
if (proxy != null) 
{ 
    Console.WriteLine("Proxy: {0}", proxy.GetProxy(request.RequestUri)); 
} 
else 
{ 
    Console.WriteLine("Proxy is null; no proxy will be used"); 
} 

WebProxy myProxy = new WebProxy(); 
Uri newUri = new Uri("http://20.154.23.100:8888"); 
// Associate the newUri object to 'myProxy' object so that new myProxy settings can be set. 
myProxy.Address = newUri; 
// Create a NetworkCredential object and associate it with the 
// Proxy property of request object. 
myProxy.Credentials = new NetworkCredential("userName", "password"); 
request.Proxy = myProxy; 

みんなありがとう... :)

+7

これは、ユーザーが自分のプロキシサーバーのアドレスとポート番号を見つけて、そのユーザー名とパスワードをアプリケーションにどこかに保存する(クリアまたは必然的に可逆暗号化を使用) - ほとんど理想的ではありません - ほとんどのシナリオではおそらく有効な、きれいな方法で私の答えをチェックしてください。 – tomfanning

+1

あなたのアプリにプロキシのアドレスと認証情報を保存するのは良い考えではありません。他の2つの回答のいずれかがこれより優れています –

+0

私は同意します、これは正解ではありません。 –

69

このメソッドは、ハードコードに必要性を回避またはプロキシ認証情報を設定することができこれが望ましいことがある。

あなたのアプリケーション構成ファイルでこれを入れて - おそらくapp.configを。 Visual Studioはビルド時にyourappname.exe.configに名前を変更し、実行可能ファイルの隣に表示されます。アプリケーション構成ファイルがない場合は、Visual Studioで新規アイテムの追加を使用してファイルを追加します。

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <system.net> 
    <defaultProxy useDefaultCredentials="true" /> 
    </system.net> 
</configuration> 
+0

これは動作しますが、私はプロキシURLを提供する必要がありました。 – Vanuan

+0

これは私にとって完璧に機能しました。ありがとう、トン! – MrBubbles

+0

これは良い方法です。コードに資格情報を追加する必要はありません。 +1 ..シームレスに動作します – csharpcoder

18

私は、HttpWebRequestのは、デフォルトで正しいプロキシの詳細をピックアップしUseDefaultCredentialsはどちらか動作しませんでした設定していませんでした非常に似たような状況になっていました。コードの設定を強制しかし御馳走働い:

IWebProxy proxy = myWebRequest.Proxy; 
if (proxy != null) { 
    string proxyuri = proxy.GetProxy(myWebRequest.RequestUri).ToString(); 
    myWebRequest.UseDefaultCredentials = true; 
    myWebRequest.Proxy = new WebProxy(proxyuri, false); 
    myWebRequest.Proxy.Credentials = System.Net.CredentialCache.DefaultCredentials; 
} 

をし、これが既定の資格情報を使用するためには、その詳細をユーザーに尋ねるべきではありません。

+0

これは私のコンソールアプリケーションでは機能しましたが、.NETアプリケーションではHTTPSをサポートしていません。 tomfanningからの解決策が機能します。ありがとう! – Smeiff

2

この問題は、私のための唯一の回避策は、特定のURLリクエストが理想的ではありません、プロキシで認証する必要がないように私たちのファイアウォール上の例外を作るために私たちのネットワークチームに依頼することだった年の間、私を盗聴されていました。

最近私は3.5から.NET 4にプロジェクトをアップグレードすると、コードがちょうどプロキシの既定の資格情報を使用して作業を開始し、資格情報など

request.Proxy.Credentials = CredentialCache.DefaultCredentials; 
-1

のないハードコーディングは、この

を試していませんプロキシサーバーは、どのような認証スキームを必要としない
 var YourURL = "http://yourUrl/"; 

     HttpClientHandler handler = new HttpClientHandler() 
     { 
      Proxy = new WebProxy("http://127.0.0.1:8888"), 
      UseProxy = true, 
     }; 

     Console.WriteLine(YourURL); 

     HttpClient client = new HttpClient(handler);