HttpWebRequest utilizando la autenticación básica

Estoy intentando realizar una solicitud de autenticación que imita la “solicitud de autenticación básica” que estamos acostumbrados a ver al configurar IIS para este comportamiento.

La URL es: https://telematicoprova.agenziadogane.it/TelematicoServiziDiUtilitaWeb/ServiziDiUtilitaAutServlet?UC=22&SC=1&ST=2
(advertencia: https!)

Este servidor se ejecuta en UNIX y Java como servidor de aplicaciones.

Este es el código que uso para conectarme a este servidor:

CookieContainer myContainer = new CookieContainer(); HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://telematicoprova.agenziadogane.it/TelematicoServiziDiUtilitaWeb/ServiziDiUtilitaAutServlet?UC=22&SC=1&ST=2"); request.Credentials = new NetworkCredential(xxx,xxx); request.CookieContainer = myContainer; request.PreAuthenticate = true; HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 

(Copié esto de otra publicación en este sitio). Pero recibo esta respuesta del servidor:

La conexión subyacente se cerró: se produjo un error inesperado en un envío.

Creo que intenté todas las tareas posibles que mi conocimiento de C # tiene para ofrecerme, pero nada …

También puede agregar el encabezado de autorización usted mismo.

Simplemente haga que el nombre “Autorización” y el valor “BASE64 básico ({NOMBRE DE USUARIO: CONTRASEÑA})”

 String username = "abc"; String password = "123"; String encoded = System.Convert.ToBase64String(System.Text.Encoding.GetEncoding("ISO-8859-1").GetBytes(username + ":" + password)); httpWebRequest.Headers.Add("Authorization", "Basic " + encoded); 

Editar

Cambió la encoding de UTF-8 a ISO 8859-1 por ¿Qué encoding debo usar para la Autenticación básica de HTTP? y el comentario de Jeroen.

¡Finalmente lo conseguí!

 string url = @"https://telematicoprova.agenziadogane.it/TelematicoServiziDiUtilitaWeb/ServiziDiUtilitaAutServlet?UC=22&SC=1&ST=2"; WebRequest request = WebRequest.Create(url); request.Credentials = GetCredential(); request.PreAuthenticate = true; 

y esto es GetCredential()

 private CredentialCache GetCredential() { string url = @"https://telematicoprova.agenziadogane.it/TelematicoServiziDiUtilitaWeb/ServiziDiUtilitaAutServlet?UC=22&SC=1&ST=2"; ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3; CredentialCache credentialCache = new CredentialCache(); credentialCache.Add(new System.Uri(url), "Basic", new NetworkCredential(ConfigurationManager.AppSettings["ead_username"], ConfigurationManager.AppSettings["ead_password"])); return credentialCache; } 

¡HURRA!

Si puede usar la clase WebClient , el uso de autenticación básica se vuelve simple:

 var client = new WebClient {Credentials = new NetworkCredential("user_name", "password")}; var response = client.DownloadString("https://telematicoprova.agenziadogane.it/TelematicoServiziDiUtilitaWeb/ServiziDiUtilitaAutServlet?UC=22&SC=1&ST=2"); 

Prueba esto:

 System.Net.CredentialCache credentialCache = new System.Net.CredentialCache(); credentialCache.Add( new System.Uri("http://www.yoururl.com/"), "Basic", new System.Net.NetworkCredential("username", "password") ); ... ... httpWebRequest.Credentials = credentialCache; 

El siguiente código resolverá la respuesta json si hay una autenticación básica y un proxy implementados. También se resolverá el problm de alojamiento de IIS 7.5.

 public string HttpGetByWebRequ(string uri, string username, string password) { //For Basic Authentication string authInfo = username + ":" + password; authInfo = Convert.ToBase64String(Encoding.Default.GetBytes(authInfo)); //For Proxy WebProxy proxy = new WebProxy("http://10.127.0.1:8080", true); HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri); request.Method = "GET"; request.Accept = "application/json; charset=utf-8"; request.Proxy = proxy; request.Headers["Authorization"] = "Basic " + authInfo; var response = (HttpWebResponse)request.GetResponse(); string strResponse = ""; using (var sr = new StreamReader(response.GetResponseStream())) { strResponse= sr.ReadToEnd(); } return strResponse; } 

Para aquellos que usan RestSharp , podría fallar al usar SimpleAuthenticator (posiblemente debido a que no usan ISO-8859-1 detrás de la escena). Me las arreglé para hacerlo al enviar explícitamente encabezados de Autenticación Básica:

 string username = "..."; string password = "..."; public IRestResponse GetResponse(string url, Method method = Method.GET) { string encoded = Convert.ToBase64String(Encoding.GetEncoding("ISO-8859-1").GetBytes($"{username}:{password}")); var client = new RestClient(url); var request = new RestRequest(method ); request.AddHeader("Authorization", $"Basic {encoded}"); IRestResponse response = client.Execute(request); return response; } var response = GetResponse(url); txtResult.Text = response.Content; 

La especificación se puede leer como “ISO-8859-1” o “indefinido”. Tu elección. Se sabe que muchos servidores usan ISO-8859-1 (les guste o no) y fallarán cuando envíen algo más.

Para obtener más información y una propuesta para solucionar la situación, consulte http://greenbytes.de/tech/webdav/draft-reschke-basicauth-enc-latest.html