173 votes

HttpWebRequest avec authentification de base

J'essaie de passer par une demande d'authentification qui imite la "demande d'authentification de base" que nous avons l'habitude de voir lorsque nous configurons IIS pour ce comportement.

L'URL est le suivant : https://telematicoprova.agenziadogane.it/TelematicoServiziDiUtilitaWeb/ServiziDiUtilitaAutServlet?UC=22&SC=1&ST=2
(avertissement : https !)

Ce serveur fonctionne sous UNIX et Java comme serveur d'application.

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

(J'ai copié ceci d'un autre post 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 lors d'un un envoi.

Je pense avoir essayé toutes les tâches possibles que mes connaissances en C# peuvent m'offrir, mais rien...

355voto

Zambonilli Points 2785

Vous pouvez également ajouter vous-même l'en-tête d'autorisation.

Il suffit de nommer "Authorization" et de donner comme valeur "Basic BASE64({USERNAME:PASSWORD})"

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

Editar

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

67voto

Kenny Rullo Points 2157

J'ai enfin réussi !

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;

et ceci est 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;
}

YAY !

33voto

Tamir Points 1524

Si vous pouvez utiliser le WebClient l'utilisation de l'authentification de base devient 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");

12voto

MrEyes Points 3571

Essayez ceci :

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;

8voto

Alexei Points 3124

Pour ceux qui utilisent RestSharp il peut échouer lors de l'utilisation de Certificateur simple (peut-être en raison de la non-utilisation d'ISO-8859-1 dans les coulisses). J'ai réussi à le faire en envoyant explicitement des en-têtes d'authentification de base :

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;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X