• .net 获取浏览器Cookie(包括HttpOnly)


    网上好不容易找到的,分享+收藏

    一、接口文件

    using System;
    using System.ComponentModel;
    using System.Net;
    using System.Runtime.InteropServices;
    using System.Security;
    using System.Security.Permissions;
    using System.Text;
    
    namespace CookieHandler
    {
        internal sealed class INativeMethods
        {
            #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
        }
    }
    

      二、获取cookie类

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Net;
    using System.Runtime.InteropServices;
    using System.Security;
    using System.Security.Permissions;
    using System.Text;
    
    namespace CookieHandler
    {
        /// <SUMMARY></SUMMARY>
        /// 取得WebBrowser的完整Cookie。
        /// 因为默认的webBrowser1.Document.Cookie取不到HttpOnly的Cookie
        /// IE7不兼容,IE8可以,其它未知
        ///
        public class FullWebBrowserCookie
        {
            public static Dictionary<string, string> GetCookieList(Uri uri, bool throwIfNoCookie)
            {
                Dictionary<string, string> dict = new Dictionary<string, string>();
                string cookie = GetCookieInternal(uri, throwIfNoCookie);
                Console.WriteLine("FullWebBrowserCookie - 所有cookie:" + cookie);
                string[] arrCookie = cookie.Split(';');
                foreach (var item in arrCookie)
                {
                    string[] arr = item.Split('=');
                    string key = arr[0].Trim();
                    string val = "";
                    if (arr.Length >= 2)
                    {
                        val = arr[1].Trim();
                    }
    
                    if (!dict.ContainsKey(key))
                    {
                        dict.Add(key, val);
                    }
                }
                Console.WriteLine("FullWebBrowserCookie - cookie已载入dict,共" + dict.Count.ToString() + "项");
    
                return dict;
            }
    
            public static string GetCookieValue(string key, Uri uri, bool throwIfNoCookie)
            {
                Console.WriteLine("GetCookieValue");
                Dictionary<string, string> dict = GetCookieList(uri, throwIfNoCookie);
    
                if (dict.ContainsKey(key))
                {
                    return dict[key];
                }
                return "";
            }
    
            [SecurityCritical]
            public static string GetCookieInternal(Uri uri, bool throwIfNoCookie)
            {
                Console.WriteLine("GetCookieInternal");
    
                uint pchCookieData = 0;
                string url = UriToString(uri);
                uint flag = (uint)INativeMethods.InternetFlags.INTERNET_COOKIE_HTTPONLY;
    
                //Gets the size of the string builder     
                if (INativeMethods.InternetGetCookieEx(url, null, null, ref pchCookieData, flag, IntPtr.Zero))
                {
                    pchCookieData++;
                    StringBuilder cookieData = new StringBuilder((int)pchCookieData);
    
                    //Read the cookie     
                    if (INativeMethods.InternetGetCookieEx(url, null, cookieData, ref pchCookieData, flag, IntPtr.Zero))
                    {
                        DemandWebPermission(uri);
                        return cookieData.ToString();
                    }
                }
    
                int lastErrorCode = Marshal.GetLastWin32Error();
    
                if (throwIfNoCookie || (lastErrorCode != (int)INativeMethods.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();
            }
        }
    }
    

      

  • 相关阅读:
    又学到的2个小技巧
    CSS3 简写animation
    CSS3 区别Transform,Transition,Animation一句话
    纠错【2012年5月9日 JQuery跑马灯(文字无缝向上翻动)(自已封装的第三个插件)】
    jQuery计算选中的文本字数,并弹出一个层(插件四)
    html5Canvas绘制线条closePath();
    html5循环方式绘制矩形
    jQuery过滤not()与filter();
    javascript在firebug调试时用console.log
    jQuery插件在光标定位的地方插入文字(插件5)
  • 原文地址:https://www.cnblogs.com/suger/p/3359146.html
Copyright © 2020-2023  润新知