2017-07-22 1 views
0

Je suis en train de convertir une application WPF en UWP, mais je n'arrive pas à savoir comment faire fonctionner la connexion. L'application WPF se connecte à un site Web, obtient des cookies, lit un jeton à partir du code HTML, puis publie des données pour se connecter.C# UWP Connexion au site Web à l'aide de cookies

En WPF j'avais cette classe:

// CookieAwareWebClient.cs 
public class CookieAwareWebClient : WebClient 
{ 
    public string Method; 
    public CookieContainer CookieContainer { get; set; } 

    public CookieAwareWebClient() 
     : this(new CookieContainer()) 
    { 
    } 

    public CookieAwareWebClient(CookieContainer cookies) 
    { 
     this.CookieContainer = cookies; 
    } 

    protected override WebRequest GetWebRequest(Uri address) 
    { 
     WebRequest request = base.GetWebRequest(address); 
     if (request is HttpWebRequest) 
     { 
      (request as HttpWebRequest).CookieContainer = this.CookieContainer; 
      (request as HttpWebRequest).ServicePoint.Expect100Continue = false; 
      (request as HttpWebRequest).UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:18.0) Gecko/20100101 Firefox/18.0"; 
      (request as HttpWebRequest).Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"; 
      (request as HttpWebRequest).KeepAlive = true; 
      (request as HttpWebRequest).AutomaticDecompression = DecompressionMethods.Deflate | 
                   DecompressionMethods.GZip; 
      if (Method == "POST") 
      { 
       (request as HttpWebRequest).ContentType = "application/x-www-form-urlencoded"; 
      } 

     } 
     HttpWebRequest httpRequest = (HttpWebRequest)request; 
     httpRequest.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate; 
     return httpRequest; 
    } 

    protected override WebResponse GetWebResponse(WebRequest request) 
    { 
     WebResponse response = base.GetWebResponse(request); 
     String setCookieHeader = response.Headers[HttpResponseHeader.SetCookie]; 

     if (setCookieHeader != null) 
     { 
      try 
      { 
       if (setCookieHeader != null) 
       { 
        Cookie cookie = new Cookie(); //create cookie 
        this.CookieContainer.Add(cookie); 
       } 
      } 
      catch (Exception) 
      { 
      } 
     } 
     return response; 
    } 
} 

, qui est utilisé comme ceci:

// Program.cs 
// ... 
CookieAwareWebClient client = new CookieAwareWebClient(cookieJar); 
string response = client.DownloadString("LINK TO WEBSITE TO GET COOKIES"); 

// Get the csrf token from response html 
var tokenValue = Regex.Match(response, "name='csrf_token' 
value='(.+?)'").Groups[1].Value; 

// Prepare values to send 
string token = $"csrf_token={tokenValue}&"; 
string email = $"email={email}&"; 
string password = $"password={password}&"; 
string rememberme = $"rememberme=on&"; 
string submit = $"submit=Login"; 

string postData = token + email + password + rememberme + submit; 

client.Method = "POST"; 
response = client.UploadString("LINK TO LOGIN ACTION", postData); 

Cela fonctionne sans faille dans WPF. Comment puis-je obtenir quelque chose comme ça dans UWP? J'ai essayé d'utiliser HttpClient, mais soit je reçois une mauvaise réponse, javascript ne charge pas, ou je ne peux pas lire la réponse. Jusqu'ici, j'ai essayé de me connecter au site normal et de lire le code HTML pour obtenir le jeton. Mais j'ai une erreur de réponse.

var handler = new HttpClientHandler { AllowAutoRedirect = true }; 
var client = new HttpClient(handler); 

client.DefaultRequestHeaders.TryAddWithoutValidation("UserAgent", "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:18.0) Gecko/20100101 Firefox/18.0"); 
client.DefaultRequestHeaders.TryAddWithoutValidation("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"); 
client.DefaultRequestHeaders.TryAddWithoutValidation("KeepAlive", "true"); 
client.DefaultRequestHeaders.TryAddWithoutValidation("ServicePoint.Expect100Continue", "false"); 


var response = await client.GetAsync(new Uri("LINK")); 

// ERROR => System.Net.Http.HttpRequestException: "Response status code does not indicate success: 503()." 
response.EnsureSuccessStatusCode(); 
var html = await response.Content.ReadAsStringAsync(); 
+0

Montrez ce que vous avez essayé avec HttpClient, quelle erreur (s) le cas échéant et le comportement désiré dans un [mcve] – Nkosi

Répondre

1

Vous devez ajouter un CookieContainer au gestionnaire afin de pouvoir accéder aux biscuits retour de la demande

//have a cookie container before making the request 
var cookies = new CookieContainer(); 
var handler = new HttpClientHandler() { 
    AllowAutoRedirect = true, 
    CookieContainer = cookies, 
    AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip, 
}; 

//Handle TLS protocols (https) 
System.Net.ServicePointManager.SecurityProtocol = 
    System.Net.SecurityProtocolType.Tls 
    | System.Net.SecurityProtocolType.Tls11 
    | System.Net.SecurityProtocolType.Tls12; 

var client = new HttpClient(handler); 

client.DefaultRequestHeaders.TryAddWithoutValidation("UserAgent", "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:18.0) Gecko/20100101 Firefox/18.0"); 
client.DefaultRequestHeaders.TryAddWithoutValidation("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"); 
client.DefaultRequestHeaders.TryAddWithoutValidation("KeepAlive", "true"); 
client.DefaultRequestHeaders.TryAddWithoutValidation("ServicePoint.Expect100Continue", "false"); 

var uri = new Uri("Link"); 
var response = await client.GetAsync(uri); 

var html = await response.Content.ReadAsStringAsync(); 

// Get the csrf token from response html 
var tokenValue = Regex.Match(html, "name='csrf_token' value='(.+?)'").Groups[1].Value; 


//...Prepare values to send 
+0

J'extrais le csrf du code html. Je ne peux pas obtenir le code html parce que si je fais "string html = client.GetStringAsync (uri);" Je reçois une erreur que la réponse sinon le code 503. – er4zox

+0

@ er4zox Je ne comprends pas votre commentaire. Vous pouvez obtenir le code HTML à partir du contenu de la réponse. – Nkosi

+0

@ er4zox 503 indique également que le problème concerne le serveur que vous appelez et non votre client. – Nkosi