.net web-services authentication webrequest

.net - Forzar la autenticación básica en WebRequest



web-services authentication (4)

Acabo de encontrar este fragmento de código muy útil para hacer exactamente lo que necesita. Agrega el encabezado de autorización al código manualmente sin esperar el desafío del servidor.

public void SetBasicAuthHeader(WebRequest request, String userName, String userPassword) { string authInfo = userName + ":" + userPassword; authInfo = Convert.ToBase64String(Encoding.Default.GetBytes(authInfo)); request.Headers["Authorization"] = "Basic " + authInfo; }

Úselo así

var request = WebRequest.Create("http://myserver.com/service"); SetBasicAuthHeader(request, userName, password); var response = request.GetResponse();

Estoy integrando un servicio web que usará HTTP-POST para solicitar y recuperar datos. El servidor remoto requiere autenticación básica según RFC 2617

Mis intentos de autenticación están fallando.

No funciona, aunque adjunto un objeto ''NetworkCredential'' a la propiedad ''Credentials'' de un objeto ''HttpWebRequest'', no se envía información de autenticación en el encabezado, incluso si configuro ''PreAuthenticate'' = true.

¿Qué me estoy perdiendo?

// fragmento utilizado

NetworkCredential netCredential = new NetworkCredential(" uid", "pwd"); Uri uri = new Uri("http://address of services"); ICredentials credentials = netCredential.GetCredential(uri, "Basic"); objRegistration.Credentials = credentials; objRegistration.PreAuthenticate = true;


Aquí está mi solución para OAuth. El valor está en la variable json.

var myUri = new Uri(fullpath); var myWebRequest = WebRequest.Create(myUri); var myHttpWebRequest = (HttpWebRequest)myWebRequest; myHttpWebRequest.PreAuthenticate = true; myHttpWebRequest.Headers.Add("Authorization", "Bearer " + AccessToken); myHttpWebRequest.Accept = "application/json"; var myWebResponse = myWebRequest.GetResponse(); var responseStream = myWebResponse.GetResponseStream(); if (responseStream == null) return null; var myStreamReader = new StreamReader(responseStream, Encoding.Default); var json = myStreamReader.ReadToEnd(); responseStream.Close(); myWebResponse.Close();


Encontré esta pregunta mientras buscaba la respuesta, la respuesta dada funciona pero no es flexible, así que si desea una mejor forma de hacerlo .NET.

Uri uri = new Uri("http://address of services"); HttpWebRequest objRegistration = (HttpWebRequest)WebRequest.Create(url); CredentialCache credentials = new CredentialCache(); NetworkCredential netCredential = new NetworkCredential(" uid", "pwd"); credentials.Add(uri, "Basic", netCredential); objRegistration.Credentials = credentials;

Puede reemplazar "Básico" por "Resumen", "NTLM" o "Negociar" y también puede agregar varios tipos a la memoria caché.


Mejorando un poco la respuesta aceptada de samuel-jack. En lugar de usar la codificación predeterminada, se debe usar "ISO-8859-1" como se menciona en esta respuesta. ¿Qué codificación debo usar para la Autenticación básica de HTTP?

Entonces el código se vería así:

public void SetBasicAuthHeader(WebRequest request, String userName, String userPassword) { string authInfo = userName + ":" + userPassword; authInfo = Convert.ToBase64String(Encoding.GetEncoding("ISO-8859-1").GetBytes(authInfo)); request.Headers["Authorization"] = "Basic " + authInfo; }