2009-11-09 27 views
31

Estoy tratando de usar HTTPWebRequest para acceder a un servicio REST, y estoy teniendo problemas para transmitir las credenciales, vea el código a continuación. He leído que NetworkCredential no es compatible con SSL, y estoy ingresando a un sitio HTTPS. ¿Alguien sabe de una clase similar a NetworkCredential que no admite SSL?HttpWebRequest no pasa credenciales

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(); 

Respuesta

20

Si el servidor utiliza la autenticación NTLM es posible que intente esto:

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

Esto funcionó para yo, gracias –

3

intente configurar request.PreAuthenticate true.

+1

Según [this] (http://weblog.west-wind.com/posts/2010/Feb/18/NET-WebRequestPreAuthenticate-not-quite-what-it-sounds-like) no funcionará. Todavía necesito algo de trabajo – chaZm

25

¿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 HTTP Authorization a través de Basic, Digest o NTLM. Por lo tanto, si su servicio web está protegido con WS-Security, el NetworkCredentials probablemente no se pasará al esquema de autenticación, 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.

Update después de comentarios:

Parece como HttpWebRequest necesidades para recibir el desafío con una WWW-Authenticate401 Unauthorized antes de que pueda autenticar correctamente a través de SSL. Supongo que hay dos rutas de código separadas en HttpWebRequests que manejan el tráfico HTTP regular y el tráfico HTTPS cifrado. De todos modos, lo que se debe tratar, es:

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

Otra opción es construir la cabecera Authorization a sí mismo 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); 
+0

Lo siento, hasta ahora no me había dado cuenta de que es un servicio REST al que llamo, por lo que ahora hay un archivo wsdl. Además, puedo recorrer el código en el depurador y puedo ver que crea correctamente el objeto NetworkCredentials, pero parece que no se transfiere con HttpWebRequest. Una cosa más: puedo llamar al servicio REST de forma exitosa escribiéndolo en la barra de direcciones de mi navegador, así que debe usar mis credenciales de esa manera. –

+1

No ha escrito qué esquema de autenticación está usando y de dónde tiene sus credenciales. Además, si se trata de un servicio REST, no debería tener un archivo WSDL. Un servicio web con un archivo WSDL generalmente es un servicio web SOAP que es el opuesto directo de un servicio web REST. ¿Ser capaz de acceder al servicio web con un navegador (sin escribir credenciales?) Parece estar protegido con autenticación HTTP, posiblemente NTLM. ¿Es esto cierto? –

+0

Además, ¿cuál es la respuesta que obtienes? ¿Es un '401 no autorizado',' 403 prohibido' o algo más? –

48

Ver si se muestra cuando se utiliza el método antiguo:

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

esto funcionó para mí. – ryancammer

+0

acaba de funcionar para mí, también. – SouthShoreAK

+0

Ha solucionado mi problema. Upvoted debido a su concisión. – Skitterm

Cuestiones relacionadas