Accéder aux cookies du webbrowser de votre application

Accéder aux cookies du webbrowser de votre application

Lorsque votre application contient un contrôle de type WebBrowser, il peut parfois être nécessaire d’accéder aux cookies de ce dernier. Malheureusement ceci était impossible avec Windows Phone 7.0, mais maintenant possible avec le nouveau SDK 7.1 (pour Windows Phone 7.5 ou ‘Mango’).

WebBrowserExtension

Mango apporte donc une nouvelle classe nommée : WebBrowserExtension (voir sur la MSDN), qui expose notamment une méthode GetCookies qui retourne une collection de cookie.

La méthode prend en paramètre un contrôle de type WebBrowser, il est donc possible d’accéder aux cookies d’un WebBrowser parmi d’autres sans soucis.

var cookies = WebBrowserExtensions.GetCookies(MyWebBrowser);

foreach (Cookie cookie in cookies)
{
...
}

Usage

Un des usages qui peut être intéressant est de récupérer les cookies pour ensuite s’en servir dans une HttpWebRequest. On peut par exemple demander à un utilisateur de se connecter à un site, récupérer les cookies et ensuite les utiliser pour appeler d’autres pages du site sans passer par le navigateur.

Par exemple :

 HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create("http://www.contoso.com");
      req.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.0.3705;)";
      req.Method = "POST";
      req.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
      req.Headers.Add("Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7");
      req.KeepAlive = true;
      req.AllowAutoRedirect = false;
      req.CookieContainer = WebBrowserExtensions.GetCookies(MyWebBrowser);

Nous avons un accès en lecture seule aux cookies, il est impossible d’en injecter, d’en modifier ou d’en supprimer.

De plus, nous n’avons accès qu’aux cookies de la page courante et non à l’ensemble des cookies !

A quel niveau sont stocké les cookies ?

On pourrait se poser la question de comment Windows Phone gère les cookies au sein d’une application. On pourrait par exemple se demander que se passe t’il si j’ai deux webbrowser sur une même page, partagent t’ils les cookies ou ont ils chacun leurs stockages ? La question est légitime car pourquoi devoir passer un webbrowser en paramètre de la fonction GetCookie ?

En réalité, c’est l’application qui porte les cookies, donc si j’ai plusieurs webbrowser, ils vont tous se partager le même contexte, comme internet explorer et ses onglets par exemple. De plus, l’application va sauvegarder les cookies, ainsi, si je sors de l’application et que je la relance, ils seront toujours là.

Enfin pour répondre à la question de savoir pourquoi passer le webbrowser en paramètre, c’est assez simple : comme on l’a dit précédemment, seule les cookies de la page courante sont retournés, donc en passant le webbrowser, la fonction va pouvoir identifier quel cookie elle doit retourner.

A savoir, si j’ouvre deux webbrowsers sur le site facebook par exemple et que je m’identifie sur l’un d’entre eux, en demandant les cookies du second, je vais récupérer aussi les cookies généré suite à l’identification, preuve du partage de mémoire entre les deux navigateurs.

Attention

Une exception peut être levé parfois lors de l’appel à la fonction GetCookies, c’est le cas par exemple lorsque l’on navigue vers le site http://www.bing.com à cause d’un cookie qu’il interprète mal, du moins avec la version 7712 de mango (beta 2 refresh):

The ‘Name’=’_HOP;_SS’ part of the cookie is invalid

 

Télécharger le projet exemple

TestWebbrowserExt

Edit : Problème de sécurité ?

Suite à la publication de cet article, j’ai eu rapidement des questions sur les risques de sécurité, en effet, si une application peut accéder à mes cookies, elle pourra savoir sur quel site je suis allé, publier des informations facebook/twitter, etc…

En fait non, chaque application est sandboxé, c’est à dire qu’un WebBrowser dans une application n’a pas accès aux cookies d’une autre, Internet Explorer compris. Ainsi, si je suis connecté à Facebook sur IE9, le webbrowser dans une autre application n’aura pas accès à ses cookies et donc, ne pourra se connecter elle aussi à facebook.

Comments are closed.