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

C# 在C中显示代理身份验证对话框#,c#,authentication,proxy,ftp,C#,Authentication,Proxy,Ftp,要访问internet,我需要一个需要身份验证的代理。我知道将网络凭据传递给代理非常简单,如下所示: FtpWebRequest request = FtpWebRequest.Create( new Uri("ftp://upload.myserver.com") as FtpWebRequest; NetworkCredential credentials = new NetworkCredential("username", "passwo

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

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时显示的相同对话框。有人知道如何提出这个对话吗

编辑

此任务的目标是通过FTP上传文件。最后我发现没有必要为FTP请求设置代理,因为.NET framework不允许通过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;

就这样

也许这对你有帮助。不确定这正是你要找的


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

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

代理身份验证

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

可以使用 从用户处获取用户名和密码数据,或 可以设计定制的用户界面

搜索稍长一点后,我找到了Microsoft知识库文章“”,其中给出了如何使用此函数对代理用户进行身份验证的示例

它们提供了一个(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示例)

“处理认证”条款进一步规定:

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

因此,我假设以下“工作流”可以成功:

  • 将代理设置为将默认代理与以下内容一起使用
  • 使用
    HttpWebRequest
    (或
    FtpWebRequest
    )请求URL
  • 如果407 HTTP状态代码为return,则调用
    interneterdLG
    函数
  • 请重试URL请求
  • 这可能会起作用,因为他说他最近打开Internet Explorer并在那里输入代理凭据时成功地使用了
    WebRequest

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


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

    我没有足够的知识回答您的问题,只需创建一个登录表单,您必须在连接之前输入用户名和密码。嗨,尼克,这当然很容易做到,但对我来说,这就像是重新发明轮子。即使在对话中也提到了这个。谢谢,但这不是我要找的东西。最后我在别的地方找到了我想显示的对话框,我想这会更容易,比如调用一个框架方法来检查网络连接本身并弹出对话框本身。毕竟你是完全正确的!我自己做的,据我所知,每个程序都有自己的代理身份验证对话框(Firefox、Kaspersky等)