web-dev-qa-db-ja.com

C#のプロキシ基本認証: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;

私は考えられるすべてのことを試しましたが、何かが欠けているようです。次のようなリクエストですか?最初に資格情報なしで、資格情報の必要性についてサーバーから返事を聞いたら、資格情報で同じリクエストを行いますか?

40
rplusg

ここに、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;

助けてくれてありがとう... :)

17
rplusg

この方法では、ハードコーディングやプロキシ資格情報の構成が不要になる場合がありますが、これが望ましい場合があります。

これをアプリケーション構成ファイル(おそらく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>
76
tomfanning

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;
}

また、これはデフォルトの資格情報を使用するため、ユーザーに詳細を尋ねないでください。

23
Carl Onager

この問題は長年私を悩ませてきましたが、私にとって唯一の回避策は、ファイアウォールで例外を作成するようネットワークチームに依頼して、特定のURLリクエストをプロキシで認証する必要がないようにすることでした。

最近、プロジェクトを3.5から.NET 4にアップグレードしました。コードは、プロキシの既定の資格情報を使用して、資格情報のハードコーディングなどを使用せずに動作を開始しました。

request.Proxy.Credentials = CredentialCache.DefaultCredentials;
3
Robbo