3

我花了一些时间搜索这个网站上的文章,以准确找到我想要完成的事情,但到目前为止还没有运气。我正在客户端应用程序中执行 Web 请求,我想确保它通过代理工作。我将 Fiddler2 设置为代理服务器进行测试,并强制它要求身份验证。

我基本上已经弄清楚如何让代理使用:

    Dim proxy As IWebProxy = WebRequest.GetSystemWebProxy()
    webService.Proxy = proxy

我还尝试通过以下方式获取代理的正确凭据

    webService.Proxy.Credentials = System.Net.CredentialCache.DefaultCredentials

并将其添加到配置部分下的 app.config 中:

    <system.net>
        <defaultProxy useDefaultCredentials="true" />
    </system.net>

这两种情况我都得到相同的网络异常:

    The request failed with HTTP status 407: Proxy Auth Required.

Fiddler2 的代理的用户名为 1,密码为 1,如果我以编程方式将这些作为请求的凭据,则请求将成功通过身份验证。但是,它无法像获取代理信息一样从 IE 获取凭据是否有原因?

Fiddler 的代理是否也是其工作方式的一个例外?使用 Windows 身份验证的普通代理是否适合我尝试获取凭据的方式,有什么方法可以轻松测试吗?

4

1 回答 1

2

大多数(但不是所有)需要身份验证的代理都使用当前用户的 Windows 登录凭据。因此,使用 DefaultCredentials 通常是正确的做法。

话虽如此,代理可能会要求自定义凭据(例如,Fiddler 想要“1:1”),当这种情况发生时,您的代码无法真正知道这些凭据是什么。您可能有一些运气要求 CredMan 查看是否有目标代理领域的存储凭证,但这通常不起作用(假设它曾经起作用)。您通常不能“向 IE 询问”凭据,因为作为一般规则,它不会永久存储凭据;相反,它会在会话的第一个请求时提示用户输入它们,并在该会话的整个生命周期内将它们保存在内存中。

如果您希望您的软件在具有此类代理的环境中运行,您应该捕获 HTTP/407 响应并提示用户输入他们的代理凭据,您可以在重试时手动将其添加到请求中。

有关此主题的讨论,请参阅我的IEInternals博客文章。

于 2013-02-01T23:23:00.823 回答