服务器之家

服务器之家 > 正文

.net 获取浏览器Cookie(包括HttpOnly)实例分享

时间:2019-11-18 13:54     来源/作者:asp.net教程网

一、接口文件

 

复制代码代码如下:


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(); 
        } 
    } 
}

相关文章

热门资讯

玄元剑仙肉身有什么用 玄元剑仙肉身境界等级划分
玄元剑仙肉身有什么用 玄元剑仙肉身境界等级划分 2019-06-21
男生常说24816是什么意思?女生说13579是什么意思?
男生常说24816是什么意思?女生说13579是什么意思? 2019-09-17
配置IIS网站web服务器的安全策略配置解决方案
配置IIS网站web服务器的安全策略配置解决方案 2019-05-23
Nginx服务器究竟是怎么执行PHP项目
Nginx服务器究竟是怎么执行PHP项目 2019-05-24
运维必须知道的关于云服务器的十个问题
运维必须知道的关于云服务器的十个问题 2019-05-24
返回顶部

721
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40