2011-11-26 5 views
-5

J'ai essayé de nombreuses façons de me connecter à un site Web https par programmation, mais j'ai des problèmes. Chaque fois que je reçois une erreur indiquant que mon identifiant et mon mot de passe sont incorrects. Je suis sûr qu'ils sont corrects parce que je peux me connecter au site via le navigateur en utilisant les mêmes informations d'identification.HttpWebRequest, C# et Https

A défaut de code

HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("https://www.majesticseo.com/account/login?EmailAddress=myemail&Password=mypass&RememberMe=1"); 
request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:8.0) Gecko/20100101 Firefox/8.0"; 
request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,**;q=0.8"; 
request.UnsafeAuthenticatedConnectionSharing = true; 
request.Method = "POST"; 
request.KeepAlive = true; 
request.ContentType = "application/x-www-form-urlencoded"; 
request.AllowAutoRedirect = true; 
request.CookieContainer = container; 

HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 

//String tmp; 
foreach(Cookie cookie1 in response.Cookies) 
{ 
    container.Add(cookie1); 
} 

Stream stream = response.GetResponseStream(); 

string html = new StreamReader(stream).ReadToEnd(); 
Console.WriteLine("" + html); 
+0

Quel est le but de tout le code commenté? Est-ce pertinent à la question? Sinon, supprimez-le. –

+0

Bien évidemment, vous ne faites pas d'authentification BASIC, donc je ne peux pas vraiment vous dire quels champs doivent être définis car je n'ai aucune idée de ce que ce site est. Aussi s'il vous plaît formater et nettoyer ce code, il est remarquablement déroutant dans sa forme actuelle. –

Répondre

0

Vous essayez de poster quelque chose (je ne vois pas, quoi, à partir de votre code) mais pas les informations d'identification. Je suppose que votre page web vous montre un formulaire web où vous entrez votre nom d'utilisateur (adresse e-mail?) Et votre mot de passe. Ensuite, les navigateurs affichent ce formulaire. Par conséquent, vous devez répliquer le comportement du navigateur - encoder le contenu du formulaire et l'envoyer dans votre demande de publication. Utilisez certains outils de développement webmaster pour les navigateurs populaires pour voir ce que le navigateur client envoie exactement au serveur et comment il code les données de formulaire. Ensuite, il est très probable que votre requête nécessite des cookies spéciaux que vous pouvez collecter en visitant une autre page (par exemple une page de connexion). L'envoi de cookies prédéfinis (comme vous le faites dans le code commenté) ne fonctionnera pas pour la plupart des sites.

En d'autres termes, le mécanisme approprié est:

  1. GET la page Web de connexion
  2. les cookies
  3. recueillir
  4. données de formulaire POST et passer les cookies recueillis dans la demande.
  5. recueillir d'autres cookies qui auraient pu être envoyés après la connexion.
+0

J'essayais de cette façon mais ça ne fonctionnait pas. La première solution fonctionne (envoi de données de connexion sous la forme d'un tableau d'octets). Je vous remercie. – jars

+0

@jars bien, je ne pense pas que quiconque sera en mesure de vous aider ici sans débogage de votre code et en vérifiant votre site particulier. Donc vous n'avez pas de chance ici. –

1

Ce site utilise HTTP POST pour la connexion, et n'envoie pas le nom d'utilisateur et le mot de passe dans l'URL.

L'URL de connexion correcte est https://www.majesticseo.com/account/login

Vous devez créer une chaîne de données à envoyer, le convertir en un tableau d'octets, définissez la longueur du contenu, puis faites votre demande. Il est très important que la longueur du contenu soit envoyée. Sans cela, le post ne fonctionnera pas. Où dans votre code définissez-vous les informations d'identification?

 HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("https://www.majesticseo.com/account/login?EmailAddress=myemail&Password=mypass&RememberMe=1"); 

     request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:8.0) Gecko/20100101 Firefox/8.0"; 
     request.Referer = "https://www.majesticseo.com/account/login"; 
     request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,**;q=0.8"; 
     request.UnsafeAuthenticatedConnectionSharing = true; 
     request.Method = "POST"; 
     request.KeepAlive = true; 
     request.ContentType = "application/x-www-form-urlencoded"; 
     request.AllowAutoRedirect = true; 

     // the post string for login form 
     string postData = "redirect=&EmailAddress=EMAIL&Password=PASS"; 
     byte[] postBytes = System.Text.Encoding.ASCII.GetBytes(postData); 

     request.ContentLength = postBytes.Length; 

     System.IO.Stream str = request.GetRequestStream(); 

     str.Write(postBytes, 0, postBytes.Length); 

     str.Close(); 

     HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 

     System.IO.Stream stream = response.GetResponseStream(); 


     string html = new System.IO.StreamReader(stream).ReadToEnd(); 

     Console.WriteLine("" + html);