c# - password - HttpWebRequest utilizando la autenticación básica
httpwebrequest credentials c# (7)
¡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!
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 ...
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;
}
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
Para aquellos que usan RestSharp , puede fallar al usar SimpleAuthenticator (posiblemente debido a no usar ISO-8859-1 detrás de). 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;
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;
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");
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 codificación de UTF-8 a ISO 8859-1 por ¿Qué codificación debo usar para la Autenticación básica de HTTP? y el comentario de Jeroen.