2009-08-16 16 views
4

Ich versuche, WebRequest zu einer Webseite nach erfolgreicher Anmeldung in gesicherten Web-Portal über WPF WebBrowser-Steuerelement zu bauen, aber stecken mit dem Problem der Wiederverwendung von WebBrowser-Cookies in WebRequest.WPF WebBrowser Cookies in WebRequest verwendet werden

Im Gegensatz zu WinForms gibt es im WPF-WebBrowser-Steuerelement keine Möglichkeit, CookieCollection über WebBrowser.Document.Cookies zu extrahieren, da das Document-Objekt keine Cookie-Eigenschaft besitzt. Der einzige Weg, ich fand, ist mshtml.HTMLDocument2 zu verwenden, welche Cookies als String

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

hat aber es ist nicht gut genug ist, so wie MSHTML.Document2 sieht - erlaubt keine wichtigen Httponly-Cookies (wie ASP zu extrahieren. Net_SessionID) - und ich muss manuell CookieCollection-Objekt von Cookies Zeichenfolge erstellen.

Als Ergebnis schlägt WebRequest mit Cookies, die aus string erstellt wurden, mit Session-Timeout-Fehler fehl, da ASP.Net_SessionID nicht verfügbar ist.

Gibt es eine andere Möglichkeit, ordnungsgemäßes und vollständiges CookieCollection-Objekt aus WPF WebBrowser-Steuerelement zu erstellen?

Antwort

3

Update: Nach EricLaw seinen Kommentar gepostet, hier ist ein Code-Snippet könnten Sie ein Httponly-Cookies erhalten verwenden:

[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) 
    } 

Der Wert würde im String "Cookie"

gespeichert werden

Ein detaillierteres Beispiel kann in dieser MSDN blog post gefunden werden.

Die einzige andere Möglichkeit, Cookies aus dem WebBrowser zu erhalten, die ich kenne, ist die InternetGetCookie-Methode, wie in dieser StackOverflow answer erwähnt.

Es ist jedoch nicht möglich, HttpOnly-Cookies zu erhalten, da sie als Sicherheitsfunktion in Browsern nicht wiederherstellbar sind. Dies verhindert Cross-Site-Scripting. Dies funktioniert in WinForms genauso wie in WPF. Weitere Informationen zu HttpOnly-Cookies finden Sie in der Wikipedia HTTP Cookie article.

+1

Verwenden Sie InternetGetCookieEx und übergeben Sie das INTERNET_COOKIE_HTTPONLY-Flag. – EricLaw

+0

@EricLaw danke für die Korrektur! –

Verwandte Themen