【问题标题】:Sending cookies from C# Application to an Internet Explorer pop-up window将 cookie 从 C# 应用程序发送到 Internet Explorer 弹出窗口
【发布时间】:2010-11-01 21:23:54
【问题描述】:

我有一个 C# 应用程序,它具有指向使用相同登录凭据的 Web 应用程序上某些功能的链接。如果用户已使用应用程序登录并单击链接,则会打开一个新的浏览器窗口(通常是 IE,但可能只是默认浏览器)并要求他们再次进行身份验证。

有没有办法让帐户保持登录状态,无论是在 C# 应用程序中还是在单独的浏览器窗口中? Web 应用程序使用 cookie 存储用户会话变量以进行身份​​验证,C# 应用程序具有相同的会话信息但不在 cookie 中。

基本上我需要从 C# 应用程序的会话信息中创建一个 cookie 并将其传递给新的浏览器窗口。

有什么想法吗?

【问题讨论】:

  • 请说明您所说的“C# 表单”是什么意思,以及它与普通浏览器窗口有何不同。
  • 你的意思是你有一个允许你浏览网站的 Windows 应用程序?
  • 我想我的回答在你澄清你是从 Windows 窗体启动窗口之后变得毫无意义。删了。

标签: c# browser cookies webforms


【解决方案1】:

我相信任何新窗口实例都会启动一个新会话,因此会清除您在通过Process.Start("iexplorer.exe", "www.msn.ca")webBrowser1.Navigate("www.msn.ca", true) 打开新浏览器之前创建的所有会话 cookie。

但是我终于找到了解决这个问题的方法。涉及以下内容:

  1. 创建您自己的 Web 浏览器,该浏览器与 Internet Explorer 几乎一模一样。请参阅以下链接以获取基本浏览器的代码并根据需要对其进行自定义。

    http://msdn.microsoft.com/en-us/library/ms379558(VS.80).aspx

    我通过用 ToolStrip ToolStripContainer 替换过时的 RaftingStrip 修复了这个错误。 (如果你想要这个调试过的代码,给我发电子邮件。我会发布它,但我认为这个论坛太长了。)

    对于我自己,我添加了

    1. 构造函数传递目标url,设置为地址栏,设置为主页,同时传递安全令牌

    2. 启用/禁用地址栏和搜索栏的属性

    3. 添加了剪切、复制、粘贴、另存为和打印按钮

    4. 将进度图标从“C#”更改为沙漏

  2. 在网络浏览器表单的声明部分,添加

    DllImport("wininet.dll", CharSet = CharSet.Auto, SetLastError = true)]
    public static extern bool InternetSetCookie(string lpszUrlName,
             string lbszCookieName, string lpszCookieData);
    
  3. 在 web 浏览器表单加载和 Create_a_new_tab() 之前,webpage.Navigate() 插入下面的行,将令牌保存到会话 cookie。 (如果导航到新域,则 button_go_click 和 button_search_click 事件可能也需要这样做。就个人而言,如果传递安全令牌,我会禁用地址和搜索栏。)

    string url = comboBox_url.Text.Trim();  // write the session cookie
    string security_token = "my_session_id=12345" // should have been passed to constructor
    InternetSetCookie(url, null, security_token);
    

用户永远不会知道其中的区别,您可以控制打开/关闭或实施哪些功能。

【讨论】:

  • 绝对不是一个简单的解决方案,但感谢您的回答!我们很久以前就决定让用户再次登录,但如果我们做出其他决定,很高兴知道需要做什么。
【解决方案2】:

我只能对嵌入式 WebBrowser 控件执行此操作(请参见下面的代码),但不能对新的 IE 窗口执行此操作。还没找到答案。

[DllImport("wininet.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern bool InternetSetCookie(string lpszUrlName, string lbszCookieName, string lpszCookieData);

string url = "http://www.google.com";

// write the session cookie
InternetSetCookie(url, null, "abc=1");

webBrowser1.Navigate(url);

【讨论】:

  • 似乎没有办法将会话从 C# 应用程序持久化到 IE 窗口。
  • 您需要设置cookie的过期时间才能在新的IE窗口中打开它。例如:InternetSetCookie("example.com", cookieName, cookieValue + ";expires=Sat, 10-Oct-2018 00:00:00 GMT");
【解决方案3】:

您可以使用通常的会话模式。

例如:

Session.Add("<sessionName>", <variable which contains the session data>>

如果你想保存一个名为“User”的变量中的用户名,你可以使用下面的代码:

Session.Add("UserName", User);

为了在您的网页中验证此会话,请在 page_lad 方法下使用以下代码。

if(Session["UserName"] != null)
{
   ********
}
else
{
   ******* (you can redirect to your home page...)
}

【讨论】:

    猜你喜欢
    • 2011-10-18
    • 2012-01-25
    • 2021-08-26
    • 1970-01-01
    • 2017-04-28
    • 1970-01-01
    • 1970-01-01
    • 2018-10-09
    • 2023-01-16
    相关资源
    最近更新 更多