【问题标题】:.Net web request through a proxy, automatically detect credentials通过代理的.Net网络请求,自动检测凭据
【发布时间】:2013-02-01 16:11:50
【问题描述】:

我花了一些时间搜索此站点上的文章,以准确找到我想要完成的任务,但到目前为止还没有运气。我正在客户端应用程序中执行 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 身份验证的普通代理是否适合我尝试获取凭据的方式,有什么方法可以轻松测试吗?

【问题讨论】:

  • 首先我认为 WebRequest 使用 IE 代理是默认的。是不是?!您是否在没有自己定义代理的情况下尝试过?! (并在 Internet 选项中使用正确的代理设置)
  • 是的,我也试过了,结果是一样的。我可以为用户添加一个表单来为我输入该信息,但对我来说,我能够以编程方式获取该信息是有意义的。

标签: .net vb.net web-services proxy fiddler


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多