From the blog

The Curious Case of the Windows HTTP Proxy

ryanblogpost (1)

The web is the preferred delivery mechanism for most applications these days but there are scenarios where you might want to build a CLI or desktop application for your customers to use. However, once you leave the cozy confines of the browser there are a whole slew of proxy configurations that your poor application will have to deal with if it needs to run within a typical corporate network.

For the purposes of this post, “typical corporate network” means your users are running some flavor of Windows and are sitting behind an authenticating HTTP proxy. While this does seem like a pretty common setup, a surprising number of applications will simply not work in this environment.

Thankfully, when writing a .NET application, the default settings get you most of the way there for free. The default web proxy will automatically use whatever proxy settings the user has configured in IE. If possible, this is what you should rely on. It is tempting to expose proxy hostname and port configuration values that the user can pass to the application, however in some cases a corporate user may not have a single well-known proxy to use. WPAD and PAC files allow proxies to be configured dynamically. See this post for more gory details.

Unfortunately, the default settings do not handle authentication for you out-of-the-box. Web requests will typically fail with a 407 ProxyAuthenticationRequired error. The next step is to examine the Proxy-Authenticate response header returned to see what type of authentication the proxy accepts. Typically this will be some combination of Basic, Digest, NTLM, or Negotiate. If the proxy supports either NTLM or Negotiate, then it is possible to automatically authenticate the signed in user running your application by simply adding the useDefaultCredentials=true attribute to your app.config as described here:

  

This is particularly nice because we don’t have to modify any of our application code nor deal with the headaches of dealing with credential management. Alas, this won’t work if the proxy is configured to use Basic or Digest authentication. While this is an unusual setup, it is something that you will come across in the wild every so often. If this is the case then you will need a way to read in a username and password and then store that in the IWebProxy.Credentials property. As pointed out here, this setup is not typically used because it puts the burden on every application to manage proxy credentials.

In C#, the default proxy settings configured in the app.config are reflected in the WebRequest.DefaultWebProxy static variable. Rather than directly modifying its Credentials, it is cleaner to create a decorator for the proxy that passes through the read requests but manages its own set of credentials without touching the underlying proxy:

public class ProxyWrapper : IWebProxy
{
    private readonly IWebProxy _proxy;
    public ProxyWrapper(IWebProxy proxy)
    {
        _proxy = proxy;
    }
    public ICredentials Credentials
    {
        get; set;
    }
    public Uri GetProxy(Uri destination)
    {
        return _proxy.GetProxy(destination);
    }
    public bool IsBypassed(Uri host)
    {
        return _proxy.IsBypassed(host);
    }
}

Then, you can do something like the following to use the default proxy settings with custom credentials:

// How these are read in depends on the application
string username = ...
SecureString password = ...
IWebProxy proxy = new ProxyWrapper(WebRequest.DefaultWebProxy);
proxy.Credentials = new NetworkCredential(username, password);
WebRequest.DefaultWebProxy = proxy;

This lets you easily switch back to the original credentials that were configured in the app.config or use a different set as needed.

Note that while all of this is pretty straightforward for people using .NET, it might not be as easy to support authenticating proxies (particularly ones that only use NTLM and Negotiate) in http libraries used in other languages. In these scenarios, some people have had success using cntlm as a proxy for the authenticating proxy.

TL;DR: For people writing applications in .NET, you should simply set useDefaultCredentials=true in your app.config file and that should “just work” most of the time.

Related articles

The Cloud of Everything: A Universal Workspace

“Many hands make light work” is as true today as it was in the 16th Century when John Heywood first coined the phrase. The historical perspective of “piecework” now gives way in modern parlance to the idea of “global collaboration”. […]

read more »

Rescale, Inc.、ANSYSのソフトウェア製品とElastic LicensingをRescaleプラットフォームに導入

RescaleとANSYSは戦略的パートナーシップを締結し、Rescaleのスケーラブルでターンキー型のクラウドベースプラットフォーム上でのANSYSのエンジニアリングシミュレーションソフトウェアの提供範囲を拡大し、ANSYSの新しいクラウドコンピューティング向けのANSYS Elastic Licensingを利用可能にすることを発表いたしました。ANSYSのユーザーは従来の年間ライセンスおよび永久ライセンスに加え、Elastic LicensingをRescaleプラットフォームで利用できるようになります。 ANSYSは、構造力学、数値流体力学(CFD)、電磁気学、陽解法、およびこれらの物理学の組み合わせを含む物理学の全範囲にわたるシミュレーション主導のソフトウェアツール群を提供しています。Rescaleの強力なターンキーシミュレーションプラットフォームでは、これらのうち8つのソフトウェア(CFX、CHEMKIN-PRO、Fluent、HFSS、Maxwell、Mechanicalなど)が事前設定され、最適化も行われています。ANSYSのユーザーは、ブラウザーを使用してRescaleプラットフォームにアクセスすることで、25以上の地域にある60以上のデータセンターで構成されるRescaleのグローバルマルチクラウドHPCネットワーク上で、高度なエンジニアリングシミュレーションを簡単に実行することができます。エンジニアは、シミュレーションを数千のCPUコアへスケールアウトできるだけでなく、安価なHPC構成から最先端のベアメタルシステム、低レイテンシのInfiniBandインターコネクト、最新のIntelおよびNVIDIAチップセットまで、ANSYSスイートの多様なニーズ向けに最適化されたハードウェア構成を選択できます。 従量課金型のハードウェアとANSYS Elastic Licensingは、エンジニアリング企業が直面するシミュレーション負荷の変動に対して、ダイナミックなHPCリソースを対応できるようにし、製品の設計サイクルを短縮し、ITの機敏性を向上させます。 「お客様は、当社のターンキーソリューションと従量課金型ハードウェアが提供する柔軟性を好んでおり、ANSYSソフトウェアユーザーにその柔軟性を広げることができて嬉しく思います。」と、Rescaleの共同設立者兼最高経営責任者(CEO)のJoris Poortは述べます。「アジャイル・リソースは、相互に関係するお客様がコンピューティングとシミュレーションを活用して、幅広い業界で新しいイノベーションをより早く推進できるよう支援するものです。さらに、企業は、Rescaleプラットフォームに組み込まれた管理およびコラボレーションツールを活用して、リソースを管理し、設計ポートフォリオ全体の結果を向上させることができます。また、エンタープライズレベルの暗号化、SOC2準拠およびITAR準拠などのクラス最高のセキュリティ機能を提供するプラットフォームを利用することができます。」 ANSYSのエンタープライズソリューション&クラウド担当副社長であるRay Milhem氏は、次のように述べています。「私たちは、包括的なエンジニアリングシミュレーションソフトウェア製品を使用して、お客様に常にさまざまな導入オプションを提供してきました。今では、RescaleとElastic Licensingでソフトウェアを利用できるようにすることで、シミュレーションやハードウェアを弾力的に拡張してプロジェクトのタイミングの要求をより良く満たすオプションを提供しています。それによってエンジニアは、以前よりも多くのパワーと柔軟性を有することができます。 Rescaleについて Rescaleは、クラウドでのハイパフォーマンスコンピューティング(HPC)とシミュレーション、およびディープラニングにおいて業界をリードするグローバルなサービスプロバイダーです。Rescaleは、グローバル・フォーチュン500をはじめとする多くの企業のエンジニアや科学者に向けて、革新的な新製品の開発と、より速くより低コストに画期的な研究開発を実現するためのサービスを提供しています。Rescaleプラットフォームは、世界で最も強力で広大なハイパフォーマンス・コンピューティング・ネットワーク上で構築されており、従来の柔軟性を欠くIT資源を、フレキシブルな、ハイブリッド、プライベートおよびパブリッククラウドの資源に転換します。 Rescaleの製品やサービスに関する詳細情報については、www.rescale.jpをご覧ください。

read more »