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)
而已!
在 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_PASSWORD
和INTERNET_OPTION_PROXY_USERNAME
值,然后将请求重新发送到代理。
所以我假设以下“工作流程”可以成功:
request.Proxy = WebRequest.GetSystemWebProxy()
.HttpWebRequest
使用(或)请求 URL FtpWebRequest
。InternetErrDlg
函数。这可能有效,因为此答案指出,WebRequest
当他最近打开 Internet Explorer 并在那里输入他的代理凭据时,他成功使用了。
所以我的假设是,只要用户登录,代理信息就存储在 Windows“用户会话”的某个位置,并且在身份验证后可供所有应用程序使用。
由于我面临着与原始海报相同的问题,我现在将尝试看看我的建议实际上是如何运作的。
首先,我要说这不是一个 IE 对话框。它应该是一个内置系统对话框。
此外,如果您调用它,您仍然需要访问输入的值并在代码中使用这些值。该对话框只是一个输入窗口,它不会让您的应用程序访问代理/互联网!此外,所有错误处理(错误、凭据等)都必须由您自己完成。
我认为检查是否需要代理(使用 Windows 注册表、wmi 等)并弹出一个自定义表单可能更容易,您可以在其中轻松访问和重用这些值。