通过代理在 WPF 中进行身份验证






2.94/5 (6投票s)
解决 WPF 通过代理进行 HttpRequests 时出现的一个棘手问题。
引言
基本情况是,我有一些代码使用 HttpWebRequest
向时间戳服务器发送请求,并且在 .NET 2.0 中运行良好。然后,我需要将其与 .NET 3.0 一起使用,并遇到了错误
(407) Proxy Authentication Required.
现在,我已经有了所有将代理添加到请求的代码,并且完全相同的代码在 .NET 2.0 中有效,所以这有点神秘。在撰写本文时,WPF 仍然相当新,因此文档不多。因此,开始了一周的浪费时间,一旦我找到了解决方案,我就觉得应该在这里记录下来,以节省其他人的时间。
有关帮助我解决问题的参考信息,您可以访问
- http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=1787970&SiteID=1
- http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=1783181&SiteID=1
- http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=2344569&SiteID=1
使用代码
事实证明,.NET 3.0 为 HttpWebRequest
调用使用自定义 CredentialPolicy
。这显然是为了提高 XBAP 应用程序的安全性,以防止将密码发送到远程代理。因此,如果 .NET 3.0 认为您的代理不是本地机器,那么它将不会发送任何身份验证信息。这依赖于另一个令人讨厌的 Microsoft 问题,即它在确定哪些机器是本地机器以及哪些机器不是本地机器方面表现很差。因此,它经常拒绝传递凭据,即使代理是本地机器(对我来说就是这种情况)。
解决方案是提供您自己的 CredentialPolicy
,允许将用户名/密码信息发送到代理。这是通过创建实现 ICredentialPolicy
接口的类并向 ShouldSendCredential
方法返回 true
来完成的。然后,使用此类的一个实例,设置 AuthenticationManager.CredentialPolicy
。下面包含一些演示代码。
class ProxyCredentials : ICredentialPolicy {
bool ICredentialPolicy.ShouldSendCredential(Uri challengeUri, WebRequest request,
NetworkCredential credential, IAuthenticationModule authenticationModule) {
return true;
}
}
class DemoRequest {
static DemoRequest() {
AuthenticationManager.CredentialPolicy = new ProxyCredentials();
}
public DoRequest() {
HttpWebRequest httprequest =
(HttpWebRequest)WebRequest.Create("http://www.ensigma.com.au/");
IWebProxy proxy = WebRequest.GetSystemWebProxy();
proxy.Credentials = System.Net.CredentialCache.DefaultCredentials;
httprequest.Proxy = proxy;
httprequest.PreAuthenticate = true;
....
}
}