如何使用 C# 应用在本地保存 Cookie

本文关键字:保存 Cookie 何使用 应用 | 更新日期: 2023-09-27 17:55:34

我有 c# 代码,它向特定域发出请求并获取响应 cookie。

现在,当我在 Internet Explorer 中转到相同的 URL 时,系统会提示我输入凭据,因为我的应用程序获得的 cookie 似乎没有像常规 cookie 的存储方式那样保存在"临时互联网文件"文件夹中。

那么,即使我的本地 c# 应用程序已关闭,如何通过 IE 存储 cookie 以供将来使用?

我确实在我的回复中得到了有效的cookie。

[新增更多信息]

IE浏览器 8Visual Studio 2010视窗 7 64位

这是我对InternetSetCookieEx的呼吁

我正在做的是在请求中使用 Cookie1 访问 URL1,我在响应中获得更多 cookie,这些 cookie 需要验证 URL2,URL2 接收 cookie 并发送更多 cookie。现在,对 URL2 的单独调用是从 Web 浏览器控件发送的,当在 Fiddler 上看到时,它似乎没有携带我从 response2 中获得的 cookie。

[DllImport("wininet.dll", CharSet = CharSet.Auto, SetLastError = true, CallingConvention = CallingConvention.Cdecl)]
 public static extern bool InternetSetCookieEx(string UrlName, string CookieName, string CookieData);
                URL1 = "my.domain.com/page1.aspx";
                URL2 = "my.domain.com/page2.aspx";
                // Request to URL1 
                HttpWebRequest request1 = HttpWebRequest.Create(URL1) as HttpWebRequest;
                request1.Method = "GET";
                request1.Accept = "*/*";
                request1.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate;
                request1.UserAgent = "CookieCreator";
                request1.KeepAlive = true;
                request1.AllowAutoRedirect = true;
                Uri uri1 = new Uri(URL1);
                request1.CookieContainer = new CookieContainer();
                request1.CookieContainer.Add(new Cookie() { Name = "Cookie1", Value = "Some Value", Domain = uri1.Host });
                HttpWebResponse response1 = (HttpWebResponse)request1.GetResponse();
                //Request to URL2
                HttpWebRequest request2 = HttpWebRequest.Create(URL2) as HttpWebRequest;
                request2.Method = "GET";
                request2.Accept = "application/x-ms-application, image/jpeg, application/xaml+xml, image/gif, image/pjpeg, application/x-ms-xbap, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*";
                request2.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate;
                request2.UserAgent = "CookieCreator";
                request2.KeepAlive = true;
                request2.AllowAutoRedirect = true;
                Uri uri = new Uri(URL2);
                request2.CookieContainer = new CookieContainer();
                //This sets session cookies, also adds the response cookie from URl1 into the request for URL2
                foreach (Cookie cookie1 in response1.Cookies)
                {
                    bool Output = InternetSetCookieEx(URL1, cookie1.Name, cookie1.Value);
                    request2.CookieContainer.Add(cookie1);
                }
                HttpWebResponse response = (HttpWebResponse)request.GetResponse();
                //This sets session cookies, hence will/should not be prompted for login credentials
                foreach (Cookie cookie2 in response2.Cookies)
                {
                    bool Output = InternetSetCookieEx(URL2, cookie.Name, cookie.Value);
                }

我在使用时遇到异常

bool Output = InternetSetCookieEx(URL1, cookie.Name, cookie.Value, "INTERNET_COOKIE_THIRD_PARTY");

例外

System.AccessViolationException 未由用户代码
处理 HResult=-2147467261 消息=尝试读取或写保护 记忆。这通常表示其他内存已损坏。
Source=Thomson.Reuters.AFO.Components.Excel StackTrace: at Thomson.Reuters.AFO.Components.Excel.DFOCookieValidator.DFOCookieValidator.InternetSetCookieEx(String urlName, string CookieName, String CookieData, String flag) at Thomson.Reuters.AFO.Components.Excel.DFOCookieValidator.DFOCookieValidator.ChartingCookieValidation(String 网址)在 C:''Codebase''DFO''AFO''Thomson.Reuters.AFO.Components.Excel''DFOCookieValidator''DFOCookieValidator.cs:line 180 在Thomson.Reuters.AFO.Components.Excel.AFOBrowser.AFOBrowserNewWindow.webBrowserNewWindow_Navigating(对象 sender, NavigatingCancelEventArgs e) in C:''Codebase''DFO''AFO''Thomson.Reuters.AFO.Components.Excel''AFOBrowser''AFOBrowserNewWindow.xaml.cs:line 139 at System.Windows.Controls.WebBrowser.OnNavigating(NavigatingCancelEventArgs e) 在MS。Internal.Controls.WebBrowserEvent.BeforeNavigate2(Object pDisp, Object&url, Object&flags, Object&targetFrameName, Object& postData, Object&headers, Boolean& cancel) InnerException:

如何使用 C# 应用在本地保存 Cookie

任何应用程序都可以为浏览器编写cookie,但它引入了应该考虑的问题。

  • 首先是兼容性,不是任何人使用相同的浏览器和相同的系统。将 cookie 从应用程序传输到用户的浏览器将是一个地狱般的维护。

  • 接下来,浏览器处理cookie方式的任何更新都会破坏您的代码,并且您最终也可能得到一个损坏的浏览器。即使您只想为 IE 创建 cookie,用户也有不同的版本。

  • 文件
  • 锁定,如果浏览器正在使用cookie文件,您可能无权在其上写入

  • 用户
  • 覆盖,如果用户已经通过浏览器登录,则为其他用户创建cookie将简单地断开初始用户的连接。

但是为了回答如何,IE提供了WinINet API,您可以使用InternetSetCookie或InternetSetCookieEx

对于IE,使用这些方法将是最干净的方法。

在 Windows Vista 及更高版本上,Internet Explorer 在保护模式下运行 Internet 内容,保护模式是一个具有独立 cookie 存储的沙箱。为了从以中等完整性运行的外部应用程序(即在 Internet Explorer 外部)在保护模式沙箱中设置 Cookie,您必须使用 IESetProtectedModeCookie 函数。

Windows 8+ 上的 E10+ 引入了增强保护模式,该模式使用 AppContainers(而不是完整性级别)进行隔离。EPM 不提供用于与 Cookie 交互的 API;IESetProtectedModeCookie 不会在 AppContainer 中设置 Cookie。(来源)

但同样,更愿意让用户自己重新登录。

显然,

这是我生成的会话cookie,它不会存储在IE cookie存储中。因此,对同一域/URL 的任何新 HTTP 请求都不会包含任何 cookie。

所以我所做的是创建一个新的 webbrowsercontrol,可见性是隐藏的,然后导航到该 URL。我现在存储在IE cookie存储中的会话cookie。