HttpWebRequest no pasa credenciales

HTTPWebRequest utilizar HTTPWebRequest para acceder a un servicio REST, y tengo problemas para transmitir las credenciales, vea el código a continuación. He leído que NetworkCredential no admite SSL y estoy visitando un sitio HTTPS. ¿Alguien sabe de una clase similar a NetworkCredential que admite SSL?

 Uri requestUri = null; Uri.TryCreate("https://mywebserver/webpage", UriKind.Absolute, out requestUri); HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(requestUri); NetworkCredential nc = new NetworkCredential("user", "password"); request.Credentials = nc; request.Method = WebRequestMethods.Http.Get; HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 

Si su servidor usa autenticación NTLM, puede intentar esto:

 CredentialCache cc = new CredentialCache(); cc.Add( new Uri("https://mywebserver/webpage"), "NTLM", new NetworkCredential("user", "password")); request.Credentials = cc; 

Vea si aparece cuando usa el método anticuado:

 string credentials = Convert.ToBase64String(ASCIIEncoding.ASCII.GetBytes("user"+ ":" + "password")); request.Headers.Add("Authorization", "Basic " + credentials); 

¿Qué tipo de mecanismo de autenticación protege el servicio web? Las credenciales establecidas en HttpWebRequest solo se pasarán a través del encabezado de Authorization de HTTP a través de Basic , Digest o NTLM . Por lo tanto, si su servicio web está protegido con WS-Security , las NetworkCredentials probablemente no se transmitirán al esquema de autenticación en absoluto, porque WS-Security no funciona en el nivel HTTP.

Lo que debe hacer es crear un proxy de cliente del servicio web para el servicio web a través de la herramienta de línea de comandos wsdl.exe o algo similar. Eso le dará acceso a esquemas de autenticación con conocimiento del Servicio Web.

Actualización después de los comentarios:

Parece que HttpWebRequest necesita recibir el desafío WWW-Authenticate con un 401 Unauthorized antes de que pueda autenticarse correctamente a través de SSL. Supongo que hay dos rutas de código separadas en HttpWebRequests manejan el tráfico HTTP regular y el tráfico HTTPS encriptado. De todos modos, lo que debes probar, es:

  1. Ejecute HttpWebRequest no autenticado en https://.../ URI.
  2. Recibe la respuesta 401 Unauthorized .
  3. Ejecute la misma solicitud, ahora con ambos conjuntos de Credentials (no estoy seguro si PreAuthenticate debe ser true o false ; pruebe ambos).
  4. Ahora debería obtener 200 OK o lo que sea que su servicio web responda.

Otra opción es crear usted mismo el encabezado de Authorization en la solicitud inicial:

 string credentials = String.Format("{0}:{1}", username, password); byte[] bytes = Encoding.ASCII.GetBytes(credentials); string base64 = Convert.ToBase64String(bytes); string authorization = String.Concat("Basic ", base64); request.Headers.Add("Authorization", authorization); 

Intenta establecer request.PreAuthenticate en true.