HttpWebRequest en utilisant l’authentification de base

J’essaie de passer par une requête d’authentification qui imite la “requête d’authentification de base” que nous avons l’habitude de voir lors de la configuration d’IIS pour ce comportement.

L’URL est la suivante: https://telematicoprova.agenziadogane.it/TelematicoServiziDiUtilitaWeb/ServiziDiUtilitaAutServlet?UC=22&SC=1&ST=2
(attention: https!)

Ce serveur s’exécute sous UNIX et Java en tant que serveur d’applications.

C’est le code que j’utilise pour me connecter à ce serveur:

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

(Je l’ai copié depuis un autre message sur ce site). Mais je reçois cette réponse du serveur:

La connexion sous-jacente a été fermée: une erreur inattendue s’est produite sur un envoi.

Je pense que j’ai essayé toutes les tâches possibles que mes connaissances sur C # doivent offrir, mais rien …

Vous pouvez également simplement append l’en-tête d’autorisation vous-même.

Faites juste le nom “Authorization” et la valeur “Basic BASE64 ({USERNAME: PASSWORD})”

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

modifier

Passage de l’encodage UTF-8 à ISO 8859-1 par Quel encodage dois-je utiliser pour l’authentification HTTP de base? et le commentaire de Jeroen.

Je l’ai enfin eu!

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

et c’est GetCredential()

 private CredentialCache GetCredential() { ssortingng 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; } 

YAY!

Si vous pouvez utiliser la classe WebClient , l’utilisation de l’authentification de base devient simple:

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

Essaye ça:

 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; 

Le code suivant résoudra la réponse de json si l’authentification de base et le proxy sont implémentés. Le problème d’hébergement IIS 7.5 sera également résolu.

 public ssortingng HttpGetByWebRequ(ssortingng uri, ssortingng username, ssortingng password) { //For Basic Authentication ssortingng authInfo = username + ":" + password; authInfo = Convert.ToBase64Ssortingng(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(); ssortingng strResponse = ""; using (var sr = new StreamReader(response.GetResponseStream())) { strResponse= sr.ReadToEnd(); } return strResponse; } 

Pour ceux qui utilisent RestSharp , il peut échouer lors de l’utilisation de SimpleAuthenticator (peut-être en raison de ne pas utiliser ISO-8859-1 derrière la scène). J’ai réussi à le faire en envoyant explicitement des en-têtes d’authentification de base:

 ssortingng username = "..."; ssortingng password = "..."; public IRestResponse GetResponse(ssortingng url, Method method = Method.GET) { ssortingng encoded = Convert.ToBase64Ssortingng(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 spécification peut être lue comme “ISO-8859-1” ou “non défini”. Votre choix. On sait que de nombreux serveurs utilisent ISO-8859-1 (que cela plaise ou non) et échouent lorsque vous envoyez quelque chose d’autre.

Pour plus d’informations et une proposition pour corriger la situation, voir http://greenbytes.de/tech/webdav/draft-reschke-basicauth-enc-latest.html