Windows HTTP プロキシの奇妙なケース

ライアンブログ投稿 (1)
最近では、ほとんどのアプリケーションで Web が推奨される配信メカニズムですが、顧客が使用する CLI またはデスクトップ アプリケーションを構築する必要があるシナリオもあります。 ただし、ブラウザーの快適な領域を離れると、一般的な企業ネットワーク内で実行する必要がある場合、貧弱なアプリケーションが対処しなければならないプロキシ構成が大量に存在します。
この投稿の目的上、「一般的な企業ネットワーク」とは、ユーザーが何らかの種類の Windows を実行し、認証 HTTP プロキシの背後に座っていることを意味します。 これは非常に一般的な設定のように見えますが、驚くほど多くのアプリケーションがこの環境では動作しません。
ありがたいことに、.NET アプリケーションを作成する場合、デフォルト設定を使用すれば、ほとんどの作業を無料で行うことができます。 デフォルトの Web プロキシは、ユーザーが IE で構成したプロキシ設定を自動的に使用します。 可能であれば、これに頼るべきです。 ユーザーがアプリケーションに渡すことができるプロキシのホスト名とポートの構成値を公開したいという誘惑にかられますが、場合によっては、企業ユーザーが使用する既知のプロキシを XNUMX つも持っていないこともあります。 WPAD および PAC ファイルを使用すると、プロキシを動的に構成できます。 見る この記事 さらに悲惨な詳細については。
残念ながら、デフォルト設定では、そのままでは認証が処理されません。 通常、Web リクエストは 407 ProxyAuthenticationRequired エラーで失敗します。 次の手順では、返された Proxy-Authenticate 応答ヘッダーを調べて、プロキシが受け入れる認証の種類を確認します。 通常、これは、Basic、Digest、NTLM、または Negotiate の組み合わせになります。 プロキシが NTLM またはネゴシエートのいずれかをサポートしている場合は、説明のように useDefaultCredentials=true 属性を app.config に追加するだけで、アプリケーションを実行しているサインインしているユーザーを自動的に認証できます。 ここ:

 

これは、アプリケーション コードを変更する必要がなく、資格情報管理の面倒な処理に対処する必要もないため、特に優れています。 残念ながら、プロキシが基本認証またはダイジェスト認証を使用するように構成されている場合、これは機能しません。 これは珍しい設定ですが、実際には頻繁に遭遇するものです。 この場合、ユーザー名とパスワードを読み取り、それを IWebProxy.Credentials プロパティに保存する方法が必要になります。 ご指摘の通り ここ, この設定は、プロキシ資格情報を管理するためにすべてのアプリケーションに負担がかかるため、通常は使用されません。
C# では、app.config で構成されたデフォルトのプロキシ設定は、WebRequest.DefaultWebProxy 静的変数に反映されます。 資格情報を直接変更するよりも、読み取りリクエストを通過させながら、基礎となるプロキシには触れずに独自の資格情報のセットを管理するプロキシのデコレーターを作成する方がよりクリーンです。

public class ProxyWrapper : IWebProxy { private readonly IWebProxy _proxy; public ProxyWrapper(IWebProxy プロキシ) { _proxy = プロキシ; public ICredentials 資格情報 { get; セット; } public Uri GetProxy(Uri destination) { return _proxy.GetProxy(destination); public bool IsBypassed(Uri host) { return _proxy.IsBypassed(host); } }

次に、次のような操作を実行して、カスタム資格情報でデフォルトのプロキシ設定を使用できます。

// これらの読み込み方法はアプリケーションによって異なります。 string username = ... SecureString password = ... IWebProxy proxy = new ProxyWrapper(WebRequest.DefaultWebProxy); proxy.Credentials = 新しい NetworkCredential(ユーザー名、パスワード); WebRequest.DefaultWebProxy = プロキシ;

これにより、app.config で構成された元の資格情報に簡単に切り替えたり、必要に応じて別のセットを使用したりできます。
.NET を使用している人にとってはこれらすべてが非常に簡単ですが、他の言語で使用されている http ライブラリで認証プロキシ (特に NTLM とネゴシエートのみを使用するプロキシ) をサポートするのはそれほど簡単ではない可能性があることに注意してください。 このようなシナリオでは、次の方法を使用して成功した人もいます。 cntlm 認証プロキシのプロキシとして。
TL;DR: .NET でアプリケーションを作成している場合は、app.config ファイルで useDefaultCredentials=true を設定するだけで、ほとんどの場合「正常に機能」するはずです。

類似の投稿