要在 WebRequest 中使用的 WPF WebBrowser Cookie

标签 wpf cookies webbrowser-control

在通过 WPF WebBrowser 控件成功登录到安全 Web 门户后,我尝试将 WebRequest 构建到网页,但遇到了在 WebRequest 中重用 WebBrowser cookie 的问题。

与 WinForms 不同,在 WPF WebBrowser 控件中,无法通过 WebBrowser.Document.Cookies 提取 CookieCollection,因为 Document 对象没有 Cookies 属性。这
我发现的唯一方法是使用 mshtml.HTMLDocument2 将 cookie 作为字符串

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

然而,它不够好,看起来像 MSHTML.Document2
- 不允许提取重要的 HttpOnly cookie(如 ASP.Net_SessionID)
- 我需要从 Cookies 字符串手动构造 CookiesCollection 对象。

因此,由于 ASP.Net_SessionID 不可用,具有从字符串构造的 cookie 的 WebRequest 因 session 超时错误而失败。

是否有另一种方法可以从 WPF WebBrowser 控件构建正确且完整的 CookieCollection 对象?

最佳答案

更新:在 EricLaw 发表他的评论后,这里有一段代码,你可以用来获取 HttpOnly cookie:

    [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“cookie”中

可以在此 MSDN blog post 中找到更详细的示例.

我所知道的从 WebBrowser 获取 cookie 的唯一其他可能方法是使用 InternetGetCookie 方法,如本文 StackOverflow answer 中所述。 .

但是,不可能获得 HttpOnly cookie,因为它们作为浏览器中的安全功能无法检索。这有助于防止跨站点脚本。这在 WinForms 中的工作方式与在 WPF 中的工作方式相同。更多关于 HttpOnly cookie 的信息可以在 Wikipedia HTTP Cookie article 中找到。 .

关于要在 WebRequest 中使用的 WPF WebBrowser Cookie,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1284232/

相关文章:

.net - 在 WPF 中缓存大量实体

wpf - 设置数据绑定(bind)数据网格的行属性

javascript - Jquery Cookie 过期时间

c# - cookies 不会很快凝固

c# - WebBrowser 控件不维护 session

c# - 更改 WebBrowser 控件的用户代理

c# wpf 表单内表单

wpf - 双向 Binding 和 TabControl 的奇怪行为

python Selenium : No such file or directory when loading Firefox Profile

c# - 如何在 System.Windows.Forms.WebBrowser 中调用自定义 Javascript?