2009-08-16 10 views
4

Je tente de construire WebRequest sur une page Web après une connexion réussie au portail Web sécurisé via le contrôle WPF WebBrowser, mais je suis bloqué par le problème de réutilisation des cookies WebBrowser dans WebRequest. Contrairement à WinForms, dans le contrôle WPF WebBrowser, il n'existe aucun moyen d'extraire CookieCollection via WebBrowser.Document.Cookies car l'objet Document n'a pas la propriété Cookies. La seule façon que je trouvé est d'utiliser mshtml.HTMLDocument2 qui a les cookies comme chaîneCookies WPF WebBrowser à utiliser dans WebRequest

 mshtml.IHTMLDocument2 doc = (mshtml.IHTMLDocument2)webBrowser.Document; 
     string cookies = doc.cookie; 

Cependant, il est pas assez bon comme dirait que MSHTML.Document2 - ne permet pas d'extraire les cookies importants HttpOnly (comme ASP. Net_SessionID) - et j'ai besoin de construire manuellement un objet CookiesCollection à partir d'une chaîne de cookies. Par conséquent, WebRequest avec les cookies construits à partir d'une chaîne échoue avec l'erreur Session timeout car ASP.Net_SessionID n'est pas disponible.

Existe-t-il une autre façon de générer un objet CookieCollection correct et terminé à partir du contrôle WPF WebBrowser?

Répondre

3

Mise à jour: Après EricLaw a posté son commentaire, voici un extrait de code vous pouvez utiliser pour obtenir un cookie HttpOnly:

[DllImport("wininet.dll", SetLastError = true)] 
    private static extern bool InternetGetCookieEx(string pchURL, string pchCookieName, 
        StringBuilder pchCookieData, ref System.UInt32 pcchCookieData, 
        int dwFlags, IntPtr lpReserved); 

    private int INTERNET_COOKIE_HTTPONLY = 0x00002000; 

    public void GetCookie() 
    { 
     string url = "http://www.bing.com"; 
     string cookieName = "ASP.NET_SessionId"; 
     StringBuilder cookie = new StringBuilder(); 
     int size = 256; 
     InternetGetCookieEx(url, cookieName, cookie, ref size, 
          INTERNET_COOKIE_HTTPONLY, null) 
    } 

La valeur serait stockée dans le StringBuilder "cookie"

Un exemple plus détaillé peut être trouvé dans ce MSDN blog post.

La seule autre façon possible d'obtenir des cookies du WebBrowser que je connais est d'utiliser la méthode InternetGetCookie comme mentionné dans ce StackOverflow answer.

Cependant, il n'est pas possible d'obtenir des cookies HttpOnly car ils sont irrécupérables en tant que fonctionnalité de sécurité dans les navigateurs. Cela permet d'éviter les scripts inter-sites. Cela fonctionne de la même manière dans WinForms que dans WPF. Plus d'informations sur les cookies HttpOnly peuvent être trouvés dans le Wikipedia HTTP Cookie article.

+1

Utilisez InternetGetCookieEx et transmettez l'indicateur INTERNET_COOKIE_HTTPONLY. – EricLaw

+0

@EricLaw merci pour la correction! –

Questions connexes