2011-05-31 24 views
8

I tiene una aplicación de forma ventanas que contiene un control WebBrowser. La idea es que WebBrowser navegue por sitios web sin interacción del usuario. El WebBrowser pasa por un proxy para acceder a Internet.control WebBrowser con un inicio de sesión de proxy automatizado

puedo ver las peticiones que viene a través del proxy, pero se les niega porque no la autenticación de proxy.

he añadido la cabecera Proxy-Authorization: Basic. Esto funciona para una página normal http pero no parece funcionar 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); 

Dónde ws es igual a new WebBrowser(). Las credenciales son correctas, porque funciona cuando lo hago de forma manual.

alguna idea de cómo puede autenticar las credenciales de proxy mediante programación?

+0

@Abat - Claro - nadie lo es. La próxima vez que realice una edición doble, simplemente agregue el motivo en la edición. –

+0

@Kyle: ¡Claro! ¡Aclamaciones! :) – abatishchev

Respuesta

3
// 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

Eso no es lo que el OP estaba pidiendo. Él quiere ejecutar todo el WebBrowser a través del Proxy. ¿Estás sugiriendo que reescriba todo para que funcione de la manera que sugieres? Él también puede hacer el control. –

+0

@Kyle: Mi propuesta es sobre no usar 'Navigate()' pero obtener HTML a través de WebRequest con WebProxy, y procesarlo usando el control WebBrowser – abatishchev

+0

Veo eso. ¿Qué sucede cuando alguien hace clic en un enlace en el sitio? –

0

Ninguno de los que van a trabajar. Debido a las características de seguridad de Windows, siempre aparecerá el cuadro de diálogo de nombre de usuario y contraseña. Primero debe almacenar las credenciales en las credenciales de Windows. Lo primero que debe hacer es descargar el paquete 'CredentialManagment' a través del administrador de paquetes NuGet. Primero debe almacenar la información del proxy en el registro, con nombre de usuario y contraseña. Aquí está el código para el registro

[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); 
     } 

entonces usted necesita para establecer las credenciales

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

utilizo esto con .NET 4.5.2

Cuestiones relacionadas