使用WebBrowser控件和代理发送身份验证

时间:2012-02-04 19:23:55

标签: c# webbrowser-control

我在我的应用程序中使用.net WebBrowser进行Web浏览,因为我知道控件基于IE因此设置代理我正在寻找如何配置IE代理设置。想出了以下代码的pinvoke InternetSetOption:

private void SetIESettings(string proxy)
{
    const int INTERNET_OPTION_PROXY = 38;
    const int INTERNET_OPEN_TYPE_PROXY = 3;

    Struct_INTERNET_PROXY_INFO struct_IPI;

    struct_IPI.dwAccessType = INTERNET_OPEN_TYPE_PROXY;
    struct_IPI.proxy = Marshal.StringToHGlobalAnsi(proxy);
    struct_IPI.proxyBypass = Marshal.StringToHGlobalAnsi("local");

    IntPtr intptrStruct = Marshal.AllocCoTaskMem(Marshal.SizeOf(struct_IPI));
    Marshal.StructureToPtr(struct_IPI, intptrStruct, true);
    InternetSetOption(IntPtr.Zero, INTERNET_OPTION_PROXY, intptrStruct, Marshal.SizeOf(struct_IPI));
}

像魅力一样工作,在设置代理后,控件会通过它。代理需要凭证的东西,在通过它之前需要给出用户名和传递。我试图为webBrowser.Navigate方法添加额外的标题,如下所示:

var credentialStringValue = "user:password";
var credentialByteArray = ASCIIEncoding.ASCII.GetBytes(credentialStringValue);
var credentialBase64String = Convert.ToBase64String(credentialByteArray);
var credentials = string.Format("Authorization: Basic {0}{1}", credentialBase64String, Environment.NewLine);

然后调用导航

webBrowser.Navigate("http://google.com", "", null, credentials);

没有帮助,仍然获得身份验证表单。还尝试添加具有相同值的Proxy-Authorization标头,但仍然没有。

还尝试设置用户并传递Internet Explorer选项,如下所示:

const int INTERNET_OPTION_USERNAME = 28;
const int INTERNET_OPTION_PASSWORD = 29;
var uesr = "user";
var pass = "password";
InternetSetOption(IntPtr.Zero, INTERNET_OPTION_USERNAME, uesr, uesr.Length + 1);
InternetSetOption(IntPtr.Zero, INTERNET_OPTION_PASSWORD, pass, pass.Length + 1);

仍然无法正常工作,安全窗口不断弹出。 显然我做错了什么,有什么建议吗?

1 个答案:

答案 0 :(得分:0)

你的方向是对的。我在使用IE comobject时遇到了这个问题

  

0x800C000E

以下MS KB详细说明了IE不支持URL地址中的用户名和密码的原因。我试图在KB中添加注册表,解决了我的问题。

https://support.microsoft.com/en-us/help/834489/internet-explorer-does-not-support-user-names-and-passwords-in-web-sit

enter image description here

创建注册表

  

HKEY_LOCAL_MACHINE \ SOFTWARE \微软\互联网   资源管理器\主\ FeatureControl \ FEATURE_HTTP_USERNAME_PASSWORD_DISABLE

添加一个DWORD值" iexplore.exe"和数据设置为" 0"

关于您的情况,我认为您只需创建一个指向您的应用的值并将数据设置为" 0"就像" iexplore.exe"并使用以下URL格式。

  

https://username:password@xxx.yyy.zzz/home