Управление WebBrowser с автоматическим входом через прокси - PullRequest
9 голосов
/ 31 мая 2011

У меня есть приложение Windows Form, содержащее элемент управления WebBrowser.Идея заключается в том, чтобы 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 {0}{1}", credentialBase64String, Environment.NewLine);

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

Где ws равно new WebBrowser().Учетные данные верны, потому что это работает, когда я делаю это вручную.

Есть идеи о том, как я могу программно Аутентифицировать учетные данные прокси?

Ответы [ 3 ]

3 голосов
/ 31 мая 2011
 // 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; 
2 голосов
/ 13 марта 2016

Никто из тех не собирается работать. Из-за особенностей безопасности Windows всегда будет появляться диалоговое окно с именем пользователя и паролем. Сначала вы должны сохранить учетные данные в учетных данных Windows. Первое, что вам нужно сделать, это загрузить пакет CredentialManagement через менеджер пакетов NuGet. Сначала вы должны сохранить информацию о прокси в реестре, используя имя пользователя и пароль. Вот код для реестра

[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

0 голосов
/ 08 декабря 2013

Здесь размещено решение:

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

Используется winnet.dll, а также пара интерфейсов класса WebBrowser, включая IAuthenticate.

.

Я не смог попробовать, но выглядит многообещающе.

...