【问题标题】:Persistent cookie not working in Internet Explorer永久性 cookie 在 Internet Explorer 中不起作用
【发布时间】:2015-08-27 05:31:15
【问题描述】:

我在 Internet Explorer 中存在持久性 cookie 的问题,即我可以设置 cookie,但无法使它们持久化。我使用的是 Internet Explorer 11,并尝试了“Internet 选项”->“高级”->“重置”,但没有帮助。

我已经写了这个测试代码:

class Program {
    public static void Main(string[] args) {
        HttpListener listener = new HttpListener();
        listener.Prefixes.Add("http://+:7777/");
        listener.Start();

        ThreadPool.QueueUserWorkItem((o) = > {
            while (listener.IsListening) {
                ThreadPool.QueueUserWorkItem((c) = > {
                    HandleRequest(c as HttpListenerContext);
                }, listener.GetContext());
            }
        });

        Console.Write("Press any key to quit . . . ");
        Console.ReadKey(true);
        listener.Stop();
        listener.Close();
    }

    static void HandleRequest(HttpListenerContext ctx) {
        var cookie = ctx.Request.Cookies["TestCookie"];

        if (cookie == null) {
            Console.WriteLine("Setting cookie...");
            var expiryDate = DateTime.UtcNow.AddDays(360);
            ctx.Response.Headers["Set-Cookie"] = "TestCookie=some_value; Path=/; Expires=" + expiryDate.ToString("ddd, dd-MMM-yyyy H:mm:ss") + " GMT; HttpOnly";
        } else {
            Console.WriteLine("Cookie: " + cookie);
        }
        ReturnString(ctx, "OK");
    }

    protected static void ReturnString(HttpListenerContext ctx, String s) {
        try {
            byte[] buf = Encoding.UTF8.GetBytes(s);
            ctx.Response.ContentLength64 = buf.Length;
            ctx.Response.OutputStream.Write(buf, 0, buf.Length);
        } catch (Exception e) {

        } // suppress any exceptions
        finally {
            // always close the stream
            ctx.Response.OutputStream.Close();
        }
    }
}

现在,当访问127.0.0.1:7777 时,我首先获得“设置cookie”,然后在所有后续请求中获得“Cookie:TestCookie=some_value”。在 Chrome 中,cookie 是持久的(我可以关闭浏览器,重新启动它,仍然得到“Cookie:TestCookie=some_value”),但这在 Internet Explorer 中不起作用。也就是说,在使用 IE 时,每次重新启动浏览器时,我都会在第一个请求上获得“设置 cookie”。所以 cookie 显然已经不存在了。

这是为什么?难道我做错了什么?肯定有某种方法可以使用 C# 服务器在 IE 中设置持久性 cookie?

【问题讨论】:

    标签: c# internet-explorer cookies


    【解决方案1】:

    嗯,我找到了答案。这很简单,真的。设置有效期时,我使用了代码

    expiryDate.ToString("ddd, dd-MMM-yyyy H:mm:ss")
    

    但这当然会创建日期的本地化表示。因为我在挪威,所以“ddd”在挪威创造了一周中的一天。当然 IE 也无法解析。

    这个简单的改变解决了问题:

    expiryDate.ToString("ddd, dd-MMM-yyyy H:mm:ss", System.Globalization.CultureInfo.InvariantCulture)
    

    抱歉,各位,给您带来的麻烦......

    【讨论】:

      【解决方案2】:

      您可以将您的网站添加到 IE 属性中的受信任区域吗?这听起来可能与安全设置有关。

      【讨论】:

      • 好吧,我可以去“安全”->“网页隐私政策”->点击“127.0.0.1”->“摘要”并选择“始终允许该站点使用cookies”。这解决了问题,但我认为我不能要求普通用户这样做。所以我正在寻找一种方法来使用 IE 默认设置。
      • 没关系。只是试图建立场景。至于它可能被阻止的原因,可能的原因是它可能认为 cookie 是第三方 cookie(例如,如果您将 cookie 设置为“localhost”,然后导航到127.0.0.1),如果它是从 iframe 中设置的,或者 cookie 中的数据包含 IE 认为可用于与您联系的信息(例如电子邮件地址)。对于 IE,通常值得包含一个 P3P 标头,告诉 IE 您的站点并非完全不安全 (en.wikipedia.org/wiki/P3P)。你试过 P3P 吗?
      • 我一直使用 127.0.0.1,在我的场景中从不使用 localhost。而且没有框架。数据是 Base64 编码的字符串,看起来不像电子邮件地址。我尝试过 P3P,但还没有投入足够的时间来正确理解它,所以基本上我只是包含了一些通过谷歌搜索找到的 P3P 内容。
      • 好的,接下来我可能会尝试通过 Telerik 的 fiddler 之类的代理找到一个在 IE(也许是 SO)中存储持久 cookie 的站点,并比较标头(特别是 Set -Cookie 标头)由该站点发送给您自己的站点,以查看是否有任何其他明显差异。我在过去看到过一些问题,例如,响应中有多个 Set-cookie 标头,这些标头被某些浏览器忽略,但被其他浏览器读取,其中第二个不是持久的,第一个是等等。值得一试.
      【解决方案3】:

      此问题可能与隐私政策有关。需要将标头设置为允许来自其他域的 cookie。检查,

      http://www.hanselman.com/blog/TheImportanceOfP3PAndACompactPrivacyPolicy.aspx

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-06-26
        • 1970-01-01
        • 2012-06-07
        • 2015-03-16
        • 2012-05-06
        • 2011-06-02
        • 2015-12-17
        • 2013-04-30
        相关资源
        最近更新 更多