IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Récupérer des cookies de connection


Sujet :

C#

  1. #1
    Membre actif
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2008
    Messages
    464
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Mars 2008
    Messages : 464
    Points : 268
    Points
    268
    Par défaut Récupérer des cookies de connection
    Bonjour,
    J'ai un site web ou je m'authentifie via webclient.

    Une fois connecté, je sais récupérer deux cookies dont les noms sont
    JSESSIONID
    SMSESSION

    Naivement je veux transporter ça, sur une page d'export via HttpWebRequest en définissant par défaut les cookie du Header de l'object HttpWebRequest.
    Mais ça ne marche pas : au bout d'un moment le contenu de ma page web est la page d'authentification.

    J'ai donc fait un peu de débug de mon site internet en faisant F12 et en voyant ce qu'on récupère comme Cookie et ce qu'on envoie et je constate un truc assez bizarre :
    Pour chaque page le JSESSIONID et SMSESSION correspond soit à la réponse de la page précédente soit à la valeur transportée jusque là si elle n'a pas été modifiée.

    Mais à un moment, une des pages est appelée par lien javascript à partir de la page précédente via un window.open et là je constate que mes cookies JSESSIONID et SMSESSION n'ont rien à voir avec les valeurs de la page précédente.
    J'en ai conclu que mon navigateur quelque part "réinitialise" ou "gère" de nouveaux cookies de connection (mais c'est peut être conclusion de non connaisseur) et je voudrai savoir comment je simule ce comportement pour appeler mes pages suivantes par httpwebrequest.

    Merci par avance pour vos explications.

  2. #2
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Points : 9 742
    Points
    9 742
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par VITALTH Voir le message
    Naivement je veux transporter ça, sur une page d'export via HttpWebRequest en définissant par défaut les cookie du Header de l'object HttpWebRequest.
    Mais ça ne marche pas : au bout d'un moment le contenu de ma page web est la page d'authentification.
    Les cookies expirent au bout d'un moment. Ca peut etre plus ou moins long selon le parametrage du site Web mais tu ne peux pas prendre le controle sur ca, c'est l'administrateur du site Web qui peut faire ca et lui seul.

    Citation Envoyé par VITALTH Voir le message
    Mais à un moment, une des pages est appelée par lien javascript à partir de la page précédente via un window.open et là je constate que mes cookies JSESSIONID et SMSESSION n'ont rien à voir avec les valeurs de la page précédente.
    J'en ai conclu que mon navigateur quelque part "réinitialise" ou "gère" de nouveaux cookies de connection (mais c'est peut être conclusion de non connaisseur)
    Ce scenario est un peu particulier. Sous certains navigateurs (peut-etre meme tous), faire un window.open equivaut a lancer une nouvelle application. Les cookies sont alors "perdus" pour la nouvelle fenetre (ils sont toujours la pour la fenetre parente, donc ils ne sont pas reellement perdus...). Il me semble que cela peut se configurer mais je ne suis pas sur et certain.

    Citation Envoyé par VITALTH Voir le message
    et je voudrai savoir comment je simule ce comportement pour appeler mes pages suivantes par httpwebrequest.
    A priori ton probleme ici est quasiment le meme que pour l'ouverture d'une nouvelle fenetre : les cookies sont "perdus" entre plusieurs sessions HttpWebRequest. Tu devrais pouvoir corriger ce probleme en conservant le CookieContainer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    // Ceci va contenir les cookies
    var cookies = new CookieContainer();
     
    // requete 1 avec les cookies
    var webRequest1 = (HttpWebRequest)WebRequest.Create(sourceURL);
    webRequest1.CookieContainer = cookies;
     
    // requete 2 avec les cookies
    var webRequest2 = (HttpWebRequest)WebRequest.Create(sourceURL);
    webRequest2.CookieContainer = cookies;
    Ca donne quoi ?

  3. #3
    Membre actif
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2008
    Messages
    464
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Mars 2008
    Messages : 464
    Points : 268
    Points
    268
    Par défaut
    En fait ce que tu proposes c'est à peu près ce que j'ai fait !
    J'ai repris le response.Cookies de la première requete et je l'ai mis dans la deuxième requete mais je suis redirigé dans la fenêtre d'authentification. Ce qui signifie pour moi que ce n'est pas les bons cookies de connections.

  4. #4
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Points : 9 742
    Points
    9 742
    Billets dans le blog
    3
    Par défaut
    Peut-on voir ton code ?

  5. #5
    Membre actif
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2008
    Messages
    464
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Mars 2008
    Messages : 464
    Points : 268
    Points
    268
    Par défaut
    Bon Ok mais ça va quand même être un peu compliqué parce que vous n'aurez pas accès au page. Je ne vous en donnerai pas l'autorisation sinon je risque d'avoir de gros problème et ma société également.

    Mon Main fait ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
     
         class Program {
            // La il y a la valeur des deux cookies après l'authentification
            private static string JSession;
            private static string MSSession;
     
            static void Main(string[] args) {
                // Oui parce que c'est du Https pour simplifier le truc quoi !
                ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(AcceptAllCertifications);
     
                // Ici c'est la page d'authentification : j'ai un peu fait une usine à gaz mais visiblement ça marche (au début j'avais pensé à un post mais ça ne marchait pas du coup j'ai pris l'option de passer par WebClient
                AuthentificationByWebClient();
                // Je vais sur la deuxième page et j'en récupère les cookies
                CookieCollection cookieCollection =  callingGetAppli();
               // Je vais sur la troisième page mais ce n'est pas les mêmes cookies
                callingGetAppliForASecondPage(cookieCollection);
            }
     
            // La pour gérer le https pour être totalement transparent mais ce n'est pas le sujet
            public static bool AcceptAllCertifications(object sender, System.Security.Cryptography.X509Certificates.X509Certificate certification, System.Security.Cryptography.X509Certificates.X509Chain chain, System.Net.Security.SslPolicyErrors sslPolicyErrors) {
                return true;
            }
     
       }

    Ma méthode d'authentification : j'avoue c'est une usine à gaz mais ça marche !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     
            public static void AuthentificationByWebClient() {
     
     
                string uri = <monUrlCibleDePost>;
                StringBuilder postData = new StringBuilder();
                postData.Append(WebUtility.UrlEncode("USER") + "=" + WebUtility.UrlEncode(<MonUser>) + "&");
                postData.Append(WebUtility.UrlEncode("PASSWORD") + "=" + WebUtility.UrlEncode(<MonPwd>) + "&");
                postData.Append(WebUtility.UrlEncode("target") + "=" + WebUtility.UrlEncode(<UnChampHidden>) + "&");
                postData.Append(WebUtility.UrlEncode("SMAUTHREASON") + "=" + WebUtility.UrlEncode(<UnAutreChampHidden>));
                string myParam = postData.ToString();
     
                using (WebClient = new WebClient()) {
                    wc.Headers[HttpRequestHeader.ContentType] = "application/x-www-form-urlencoded";
                    // En debug dans le content, le contenu html me montre que je suis bien authentifié                
                    string content = wc.UploadString(uri, myParam);
     
                    string header = wc.ResponseHeaders.ToString();
     
     
                    // J'avoue c'est un peu dégueulasse de passer par des regex pour récupérer les valeurs de cookie dans une entête http
                    string pattern = "JSESSIONID=([0-9A-Z]*);";
                    Regex reg = new Regex(pattern);
                    Match m = reg.Match(header);
                    if (m.Success) {
                        JSessionID = m.Groups[1].Value;
                    }
     
                    pattern = @"SMSESSION=([^ ;]*);";
                    reg = new Regex(pattern);
                    m = reg.Match(header);
                    if (m.Success) {
                        MSSession = m.Groups[1].Value;
                    }
     
     
                }
     
            }

    Là j'accède à ma deuxième page : dans cette page, il y a le javascript qui fait un window.open de la troisième page :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
    public static CookieCollection callingGetAppli() {
     
               HttpWebRequest request;
     
     
                try {
                    request = (HttpWebRequest)HttpWebRequest.Create(<LURLDeMaDeuxiemePage>);
                } catch (UriFormatException) {
                    request = null;
                }
                if (request == null)
                    throw new ApplicationException("Invalid URL: " + <LURLDeMaDeuxiemePage>);
     
     
                request.CookieContainer = new CookieContainer();
                request.CookieContainer.Add(new Cookie("JSESSIONID", JSessionID, "/", <domaineSouhaite>));
                request.CookieContainer.Add(new Cookie("SMSESSION", MSSession, "/", <domaineSouhaite>));
     
     
     
                HttpWebResponse response = (HttpWebResponse)request.GetResponse();
                StreamReader reader = new StreamReader(response.GetResponseStream());
                // Le contenu me donne bien le contenu attendu dont l'authentification a persisté 
                string content = reader.ReadToEnd();
     
     
     
                return response.Cookies;
     
     
            }
    A priori c'est là que ça coince, les cookies renvoyées en réponse de la deuxième page ne correspondent pas à ceux attendus dans la troisième. Dans la troisième page on attend le cookie MSSESSION que la deuxième page ne renvoie pas et qui ne correspond pas à la valeur de MSSESSION de la première page. Je le sais en regardant en débug par F12 sur mon site page / page. De plus la troisième page attend un cookie genecookie qui n'est pas présent dans la première ni dans la deuxième page en réponse.

    Voilà le code d'accès à la troisième page :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    public static CookieCollection callingGetAppliForASecondPage(CookieCollection cookiesRequest) {
     
                HttpWebRequest request;
     
     
                try {
                    // Appel de l'url appelé par window.open en javascript quand on navigue avec le navigateur
                    request = (HttpWebRequest)HttpWebRequest.Create(<MaTroisiemeUrl>)
                } catch (UriFormatException) {
                    request = null;
                }
                if (request == null)
                    throw new ApplicationException("Invalid URL: " + <MaTroisiemeUrl>);
     
     
     
     
                request.CookieContainer = new CookieContainer();
                request.CookieContainer.Add(cookiesRequest);
     
                HttpWebResponse response = (HttpWebResponse)request.GetResponse();
                StreamReader reader = new StreamReader(response.GetResponseStream());
                // Ici le contenu ressemble à la page d'authentification : les cookies n'ont pas marché
                string content = reader.ReadToEnd();
     
     
                return response.Cookies;
     
            }

  6. #6
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Points : 9 742
    Points
    9 742
    Billets dans le blog
    3
    Par défaut
    Merci pour ton code ! N'hesite pas a masquer tout ce qui doit l'etre bien entendu, et nous n'avons pas besoin d'acceder aux pages protegees non plus
    Pourquoi est-ce que tu utilises CookieCollection et non CookieContainer ? Il y a une difference entre les 2 et pas des moindres : la CookieCollection ne contient les cookies que pour un domaine en particulier. Le CookieContainer contient les cookies pour tous les domaines.

    Est-ce qu'une partie du probleme ne viendrait pas de la ?

    Aussi en me renseignant sur le cookie SMSESSION, je m'apercois que c'est emis par Site Minder en general utilise avec du Java. Je ne suis pas du tout familier avec ce genre de techno donc il faudrait peut-etre se renseigner sur la nature de ce cookie sur le forum Java... Je vois notamment qu'il contient l'heure du dernier acces, ce qui peut potentiellement changer le contenu que tu vois... Pour reference : SiteMinder Cookies, their Usage, Contents and Security.

    Apres est-ce que c'est normal ou pas, je n'en ai aucune idee.

  7. #7
    Membre actif
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2008
    Messages
    464
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Mars 2008
    Messages : 464
    Points : 268
    Points
    268
    Par défaut
    Ce que vous me dites me parle.
    En effet lorsque la fenêtre est ouverte entre la fenêtre 2 et la fenêtre 3 en manuel, si je fais un coup de F12 j'ai deux valeurs de cookies de JSESSION différente mais seul le domaine change.
    Après le problème c'est que pour avoir la CookieCollection, je m'appuie sur l'object Cookies de la HttpWebResponse, il ne me semble pas avoir d'objet de type CookieContainer dans un HttpWebResponse.

  8. #8
    Membre chevronné
    Homme Profil pro
    edi
    Inscrit en
    Juin 2007
    Messages
    905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 905
    Points : 1 923
    Points
    1 923
    Par défaut
    Apparemment il faut réutiliser le CookieContainer de la HttpWebRequest précédente (https://blogs.msdn.microsoft.com/dgo...okiecontainer/). Je suppose qu'il suffit de créer un CookieContainer unique partagé par toutes les HttpWebRequest.

  9. #9
    Membre actif
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2008
    Messages
    464
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Mars 2008
    Messages : 464
    Points : 268
    Points
    268
    Par défaut
    Alors j'ai un peu avancé mais j'y suis toujours pas

    J'ai récupérer les cookies du cookiecontainer du domaine qui m'intéressait (celui de la 3ème page). en fait pour être plus précis le JSESSIONID cookie dont j'ai parlé est lié au domaine de la 3ème page alors que le SMSESSION cookie est lié au domaine de l'ensemble des pages (le domaine est plus vaste).
    Par contre je n'ai pas récupéré le 3ème cookie qui s'appelle genecookie. Je ne sais pas d'où il vient, en naviguant par Chrome entre les 2 pages ce truc est généré par quelque chose que je ne vois pas coté client.

    Si j'accède à la troisième page avec les 2 cookies récupérées (JSESSION et SMSESSION), j'ai une erreur http 400.
    J'ai remarqué que sur le site avec le navigateur quand je navigue entre la 2 et la 3ème page, le SMSESSION cookie a une valeur qui change mais là, pareil, je ne sais pas où c'est fait coté client.

    J'ai fait un autre test aussi : je me suis authentifié avec Chrome et j'ai accédé à la 3ème page puis j'ai copié collé les valeurs de mes cookies dans un bête bout de code httpwebrequest pour accéder à la 3ème page et là, pareil j'ai une erreur http 400.

Discussions similaires

  1. [PowerShell] Se connecter à un poste distant pour récupérer des infos
    Par Tchupacabra dans le forum Scripts/Batch
    Réponses: 2
    Dernier message: 09/02/2015, 21h48
  2. Réponses: 5
    Dernier message: 16/03/2011, 18h53
  3. Récupérer des cookies définis en JS
    Par roxtar dans le forum Langage
    Réponses: 2
    Dernier message: 04/01/2009, 13h40
  4. Comment récupérer des infos sur les connections
    Par dalidasoul dans le forum Connexions aux bases de données
    Réponses: 11
    Dernier message: 24/04/2008, 10h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo