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

时间:2010-11-17 13:13:02

标签: c# authentication proxy ftp

访问互联网我支持需要身份验证的代理。我知道将网络凭据传递给代理是非常简单的:

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访问互联网时显示的同一对话框。有谁知道如何提出这个对话框?

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;

多数民众赞成!

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:3)

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

  

代理验证

     

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

     

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

搜索了一下之后,我发现了Microsoft知识库文章“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. 请求网址
  4. 如果返回407 HTTP状态代码,请调用InternetErrDlg函数。
  5. 重试网址请求。
  6. 可以工作,因为this answer表示他刚刚打开Internet Explorer并在那里输入了代理凭据时成功使用了WebRequest

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

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

答案 2 :(得分:0)

也许这可以帮到你。不确定它正是你想要的。

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