c# winform webbrowser獲取不到cookie 爲空值

1.問題描述

使用WebBrowser控件加載一個別人的網站,輸入用戶名密碼登錄成功以後,可以操作網站的增刪改查等一些操作,證明Cookie是存在的,並且通過Fiddler抓包也可以看到Cookie。但當我使用webBrowser1.Document.Cookie時卻獲取不到Cookie,是空值,這是爲什麼呢?這是由於HttpOnly屬性導致客戶端無法讀取到Cookie!

2.解決辦法

使用下列FullWebBrowserCookie.GetCookieInternal(new Uri(url)); 方法獲取HttpOnly的Cookie即可。參考:
https://blog.csdn.net/smeller/article/details/7022370
https://www.oschina.net/question/100267_65116

using System;   
using System.ComponentModel;   
using System.Net;   
using System.Runtime.InteropServices;   
using System.Security;   
using System.Security.Permissions;   
using System.Text;   
  
  
internal sealed class NativeMethods   
{  
    #region enums   
  
    public enum ErrorFlags   
    {   
        ERROR_INSUFFICIENT_BUFFER = 122,   
        ERROR_INVALID_PARAMETER = 87,   
        ERROR_NO_MORE_ITEMS = 259   
    }   
  
    public enum InternetFlags   
    {   
        INTERNET_COOKIE_HTTPONLY = 8192, //Requires IE 8 or higher   
        INTERNET_COOKIE_THIRD_PARTY = 131072,   
        INTERNET_FLAG_RESTRICTED_ZONE = 16   
    }  
 
    #endregion  
 
    #region DLL Imports   
  
    [SuppressUnmanagedCodeSecurity, SecurityCritical, DllImport("wininet.dll", EntryPoint = "InternetGetCookieExW", CharSet = CharSet.Unicode, SetLastError = true, ExactSpelling = true)]   
    internal static extern bool InternetGetCookieEx([In] string Url, [In] string cookieName, [Out] StringBuilder cookieData, [In, Out] ref uint pchCookieData, uint flags, IntPtr reserved);  
 
    #endregion   
}   
  
  
/// <SUMMARY></SUMMARY>   
/// 取得WebBrowser的完整Cookie。   
/// 因爲默認的webBrowser1.Document.Cookie取不到HttpOnly的Cookie   
///    
public class FullWebBrowserCookie   
{   
  
    [SecurityCritical]   
    public static string GetCookieInternal(Uri uri, bool throwIfNoCookie)   
    {   
        uint pchCookieData = 0;   
        string url = UriToString(uri);   
        uint flag = (uint)NativeMethods.InternetFlags.INTERNET_COOKIE_HTTPONLY;   
  
        //Gets the size of the string builder   
        if (NativeMethods.InternetGetCookieEx(url, null, null, ref pchCookieData, flag, IntPtr.Zero))   
        {   
            pchCookieData++;   
            StringBuilder cookieData = new StringBuilder((int)pchCookieData);   
  
            //Read the cookie   
            if (NativeMethods.InternetGetCookieEx(url, null, cookieData, ref pchCookieData, flag, IntPtr.Zero))   
            {   
                DemandWebPermission(uri);   
                return cookieData.ToString();   
            }   
        }   
  
        int lastErrorCode = Marshal.GetLastWin32Error();   
  
        if (throwIfNoCookie || (lastErrorCode != (int)NativeMethods.ErrorFlags.ERROR_NO_MORE_ITEMS))   
        {   
            throw new Win32Exception(lastErrorCode);   
        }   
  
        return null;   
    }   
  
    private static void DemandWebPermission(Uri uri)   
    {   
        string uriString = UriToString(uri);   
  
        if (uri.IsFile)   
        {   
            string localPath = uri.LocalPath;   
            new FileIOPermission(FileIOPermissionAccess.Read, localPath).Demand();   
        }   
        else  
        {   
            new WebPermission(NetworkAccess.Connect, uriString).Demand();   
        }   
    }   
  
    private static string UriToString(Uri uri)   
    {   
        if (uri == null)   
        {   
            throw new ArgumentNullException("uri");   
        }   
  
        UriComponents components = (uri.IsAbsoluteUri ? UriComponents.AbsoluteUri : UriComponents.SerializationInfoString);   
        return new StringBuilder(uri.GetComponents(components, UriFormat.SafeUnescaped), 2083).ToString();   
    }   
}   
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章