在C#中显示代理验证对话框

Jan*_*Jan 7 c# authentication ftp proxy

访问互联网我是一个需要身份验证的代理.我知道将网络凭据传递给代理是非常简单的,如下所示:

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

NetworkCredential credentials = new NetworkCredential("username", "password");
request.Credentials = credentials;
Run Code Online (Sandbox Code Playgroud)

这有效!

我也尝试使用,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;
Run Code Online (Sandbox Code Playgroud)

而已!

Uwe*_*eim 5

在 MSDN 文章“处理身份验证”中,作者写道:

代理认证

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

InternetErrorDlg函数可用于获取用户的用户名和密码数据,也可以设计定制的用户界面。

经过较长时间的搜索,我找到了 Microsoft 知识库文章“如何使用 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;
Run Code Online (Sandbox Code Playgroud)

(有关该函数的 P/Invoke 示例,请参阅此 MSDN 博客文章InternetErrorDlg)。

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

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

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

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

可能有效,因为此答案指出,WebRequest当他最近打开 Internet Explorer 并在那里输入他的代理凭据时,他成功使用了。

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

由于我面临着与原始海报相同的问题,我现在将尝试看看我的建议实际上是如何运作的。


Jas*_*ter 3

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