具有自动代理登录的 WebBrowser 控件

Posted

技术标签:

【中文标题】具有自动代理登录的 WebBrowser 控件【英文标题】:WebBrowser control with an automated proxy login 【发布时间】:2011-09-05 07:04:10 【问题描述】:

我有一个包含WebBrowser 控件的Windows 窗体应用程序。这个想法是让WebBrowser 在没有用户交互的情况下浏览网站。 WebBrowser 通过代理访问互联网。

我可以看到通过代理的请求,但由于代理身份验证失败,它们被拒绝。

我添加了Proxy-Authorization: Basic 标头。这适用于普通的 http 页面,但它似乎不适用于 https:

var credentialStringValue = "proxyUser:proxyPassword";
byte[] credentialByteArray = ASCIIEncoding.ASCII.GetBytes(credentialStringValue);
var credentialBase64String = Convert.ToBase64String(credentialByteArray);

string Headers = string.Format("Proxy-Authorization: Basic 01", credentialBase64String, Environment.NewLine);

ws.Navigate(url,TargetFrameName,PostData,Headers);

其中ws 等于new WebBrowser()。凭据是正确的,因为它在我手动执行时有效。

关于如何以编程方式验证代理凭据的任何想法?

【问题讨论】:

@Abat - 当然 - 没有人是。下次您进行双重编辑时,只需在编辑中添加原因。 【参考方案1】:
 // do what you want with proxy class
WebProxy webProxy = new WebProxy(host, port)

    Credentials = ...


HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create("http://example.com");
webRequest.Proxy = webProxy;

HttpWebResponse response = (HttpWebResponse)webRequest.GetResponse();
Stream receiveStream = response.GetResponseStream();

WebBrowser webBrowser = new WebBrowser();
webBrowser.DocumentStream = receiveStream; 

【讨论】:

这不是 OP 所要求的。他想通过 Proxy 运行整个 WebBrowser。您是否建议他重写所有内容以按照您的建议工作?他也可以控制。 @Kyle:我的建议是不使用Navigate(),而是通过WebRequest和WebProxy获取html,并使用WebBrowser控件进行渲染 我明白了。当有人点击网站上的链接时会发生什么? @Kyle:你是对的。作为解决方法 - 覆盖所有链接单击并通过代理以相同的方式执行请求。 @Kyle:我用谷歌搜索的解决OP问题的所有方法即将使用P/Invoke【参考方案2】:

这些都不行。由于windows安全特性,它总是会弹出用户名和密码对话框。您首先必须将凭据存储在 Windows 凭据中。您需要做的第一件事是通过 NuGet 包管理器下载 CredentialManagement 包。您首先必须将代理信息与用户名和密码一起存储在注册表中。这是注册表的代码

[DllImport("wininet.dll", SetLastError = true)]
        public static extern bool InternetSetOption(IntPtr hInternet, int dwOption, IntPtr lpBuffer, int dwBufferLength);
        public const int INTERNET_OPTION_SETTINGS_CHANGED = 39;
        public const int INTERNET_OPTION_REFRESH = 37;

 static void setProxyRegistry(string proxyhost, bool proxyEnabled, string username, string password)
        
            const string userRoot = "HKEY_CURRENT_USER";
            const string subkey = "Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings";
            const string keyName = userRoot + "\\" + subkey;

            Registry.SetValue(keyName, "ProxyServer", proxyhost, RegistryValueKind.String);
            Registry.SetValue(keyName, "ProxyEnable", proxyEnabled ? "1" : "0", RegistryValueKind.DWord);

            Registry.SetValue(keyName, "ProxyPass", password, RegistryValueKind.String);
            Registry.SetValue(keyName, "ProxyUser", username, RegistryValueKind.String);

            //<-loopback>;<local>
            Registry.SetValue(keyName, "ProxyOverride", "*.local", RegistryValueKind.String);


            // These lines implement the Interface in the beginning of program 
            // They cause the OS to refresh the settings, causing IP to realy update
            InternetSetOption(IntPtr.Zero, INTERNET_OPTION_SETTINGS_CHANGED, IntPtr.Zero, 0);
            InternetSetOption(IntPtr.Zero, INTERNET_OPTION_REFRESH, IntPtr.Zero, 0);
        

那么你需要设置凭据

 Credential credentials= new Credential
            
                Username = "Usernmae",
                Password = "Password",
                Target = "Target (usualy proxy domain)",
                Type = CredentialType.Generic,
                PersistanceType = PersistanceType.Enterprise
            ;
            credentials.Save();

我在 .NET 4.5.2 中使用它

【讨论】:

【参考方案3】:

这里发布了一个解决方案:

http://www.journeyintocode.com/2013/08/c-webbrowser-control-proxy.html

它使用winnet.dll 以及WebBrowser 类上的几个接口,包括IAuthenticate

我还没有尝试过,但看起来很有希望。

【讨论】:

以上是关于具有自动代理登录的 WebBrowser 控件的主要内容,如果未能解决你的问题,请参考以下文章

C# 使用webBrowser控件获取网页中的账号密码登录网页元素并自动填写模拟自动登录?

c#添加webBrowser控件,如何实现自动填写打开的网页中的登录帐号,密码,并且自动登陆?

VB任务实例,VB向WebBrowser控件提交表单自动登录

抑制 WebBrowser 控件中的保存/打开对话框

webbrowser 登录网页

C# webbrowser怎么判断登录是不是成功?