持久化cookie在Internet Explorer中无法工作

6
我在使用 Internet Explorer 11 时遇到了关于持久性 cookie 的问题,也就是说,我可以设置 cookie,但无法使它们持久化。我尝试过“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吧?
3个回答

2

嗯,我找到答案了。其实它非常简单,令人尴尬。在设置过期日期时,我使用了以下代码

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

当然,这会创建一个本地化的日期表示。由于我在挪威,“ddd”将创建挪威语的星期几。当然,IE无法解析它。
这个简单的更改解决了问题:
expiryDate.ToString("ddd, dd-MMM-yyyy H:mm:ss", System.Globalization.CultureInfo.InvariantCulture)

非常抱歉给大家带来麻烦。


0
你能否将你的网站添加到IE属性中的受信任区域?这似乎与安全设置有关。

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

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接