【问题标题】:Display the proxy authentication dialog in C#在 C# 中显示代理身份验证对话框
【发布时间】:2010-11-17 13:13:01
【问题描述】:

为了访问互联网,我使用了需要身份验证的代理。我知道像这样将网络凭据传递给代理非常简单:

FtpWebRequest request = FtpWebRequest.Create(
                        new Uri("ftp://upload.myserver.com") as FtpWebRequest;

NetworkCredential credentials = new NetworkCredential("username", "password");
request.Credentials = credentials;

这行得通!

我也尝试使用CredentialCache.DefaultNetworkCredentials,但这不起作用。我想避免将用户名和密码存储在任何地方(代码、数据库、配置文件)。

我认为最简单的方法是使用当我使用 Internet Explorer 访问 Internet 时显示的相同对话框。有谁知道如何提出这个对话框?

http://services.arcgisonline.com/arcgisexplorer500/help/proxy_connect_to_on_browser_request.png

编辑

此任务的目标是通过 FTP 上传文件。最后我发现不需要为 FTP 请求设置代理,因为 .NET 框架不允许通过 HTTP 代理进行 FTP 操作。但是您必须将代理属性显式设置为 null。

FtpWebRequest request = FtpWebRequest.Create(
                        new Uri("ftp://upload.myserver.com") as FtpWebRequest;

NetworkCredential credentials = new NetworkCredential("username", "password");
request.Credentials = credentials;
request.Proxy = null;

就是这样!

【问题讨论】:

  • 我没有足够的知识来回答你的问题,我只会创建一个登录表单,你必须在连接之前输入你的用户名和密码。
  • 嗨尼克,这当然很容易做到,但对我来说,这似乎是在重新发明轮子。即使在MSDN 中也提到了这个对话框。

标签: c# authentication proxy ftp


【解决方案1】:

在MSDN文章“Handling Authentication”中,作者写道:

代理认证

当客户端尝试使用代理时 需要认证,代理返回 407 状态码消息 给客户。在该消息中,代理应包括一个或多个 代理验证响应标头。这些标题包括 代理提供的身份验证方法。 WinINet 选择 它识别的第一种方法。

InternetErrorDlg function 可以使用 从用户那里获取用户名和密码数据,或者 可以设计定制的用户界面。

经过一番搜索,我找到了微软知识库文章“How To Handle Proxy Authorization with WinInet”,其中给出了如何使用此功能验证代理用户的示例。

他们提供了一个 (C++) 示例代码:

if ( InternetErrorDlg (GetDesktopWindow(),
      hReq, ERROR_INTERNET_INCORRECT_PASSWORD,
      FLAGS_ERROR_UI_FILTER_FOR_ERRORS |
      FLAGS_ERROR_UI_FLAGS_GENERATE_DATA |
      FLAGS_ERROR_UI_FLAGS_CHANGE_OPTIONS,
      NULL) == ERROR_INTERNET_FORCE_RETRY)
            goto again;

(有关InternetErrorDlg 函数的 P/Invoke 示例,请参阅 this MSDN blog post)。

“处理身份验证”文章进一步指出:

自定义接口可以使用InternetSetOption function 设置INTERNET_OPTION_PROXY_PASSWORDINTERNET_OPTION_PROXY_USERNAME 值,然后将请求重新发送到代理。

所以我假设以下“工作流程”可以成功:

  1. 将代理设置为使用request.Proxy = WebRequest.GetSystemWebProxy() 之类的默认代理。
  2. 使用HttpWebRequest(或FtpWebRequest)请求网址。
  3. 如果返回407 HTTP状态码,调用InternetErrDlg函数。
  4. 重试 URL 请求。

可以工作,因为this answer 表示他最近打开 Internet Explorer 并在那里输入了他的代理凭据时成功使用了WebRequest

所以我的假设是,只要用户登录,代理信息就存储在 Windows“用户会话”中的某个位置,并且在身份验证后可供所有应用程序使用。

由于我面临与原始发帖人相同的问题,我现在将尝试看看我的建议是如何发挥作用的。

【讨论】:

    【解决方案2】:

    首先,id 说这不是一个 IE 对话框。它应该是一个内置系统对话框。
    此外,如果您调用它,您仍然需要访问输入的值并在代码中使用这些值。该对话框只是一个输入窗口,它不会让您的应用程序访问代理/互联网!此外,所有错误处理(错误、凭据等)都必须由您自己完成。
    我认为检查是否需要代理(使用 Windows 注册表、wmi 等)并弹出一个自定义表单可能更容易,您可以在其中轻松访问和重用这些值。

    【讨论】:

    • 我认为这样做会更容易,比如调用一个框架方法来检查网络连接本身并弹出对话框本身。毕竟你是完全正确的!我自己做的,据我所知,每个程序都有自己的代理身份验证对话框(Firefox、卡巴斯基等)
    【解决方案3】:

    也许这可以帮助你。不确定它是否正是您正在寻找的。​​p>

    http://sturla.simnet.is/post/2008/09/22/Enable-proxy-in-IE.aspx

    【讨论】:

    • 谢谢,但这不是我要找的东西。最后我在其他地方找到了我希望显示的对话框。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-17
    • 1970-01-01
    相关资源
    最近更新 更多