2009-08-16 5 views
4

に使用する私は、WPFのWebBrowserコントロールを介したセキュアなウェブポータルに成功した伐採後のウェブページへのWebRequestを構築しようとするが、WebRequestクラスに、Webブラウザーのクッキーを再利用の問題で立ち往生。WPFのWebBrowserクッキーは、WebRequestクラス

WinFormsとは異なり、WPF WebBrowserコントロールでは、DocumentオブジェクトにCookiesプロパティがないため、WebBrowser.Document.Cookies経由でCookieCollectionを抽出する方法はありません。私が見つけた 唯一の方法は、文字列としてクッキーを持っているmshtml.HTMLDocument2を使用することです

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

MSHTML.Document2 のように見えるとして、それは十分ではありませんが - ASPのように(HttpOnlyの重要なクッキーを抽出することはできません。 Net_SessionID) - Cookies文字列からCookiesCollectionオブジェクトを手動で構築する必要があります。

その結果、ASP.Net_SessionIDが使用できないため、文字列から構成されたCookieを使用したWebRequestがセッションタイムアウトエラーで失敗しています。

適切で完全なCookieCollectionオブジェクトをWPF WebBrowserコントロールから構築する別の方法はありますか?

答えて

3

更新: EricLawは彼のコメントを掲載した後、ここにあなたが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) 
    } 

値はStringBuilderの「クッキー」

に格納されます

より詳細な例は、MSDN blog postに記載されています。

私が知っているWebブラウザからCookieを取得する他の方法は、StackOverflow answerで説明したInternetGetCookieメソッドを使用することです。

しかし、それは彼らが、ブラウザのセキュリティ機能として、検索不能ですとHttpOnlyのクッキーを取得することはできません。これは、クロスサイトスクリプティングを防ぐのに役立ちます。これは、WPFと同じようにWinFormsでも同じです。 HttpOnly Cookieの詳細については、Wikipedia HTTP Cookie articleをご覧ください。

+1

InternetGetCookieExを使用し、INTERNET_COOKIE_HTTPONLYフラグを渡します。 – EricLaw

+0

@EricLaw訂正ありがとう! –

関連する問題