set-cookie似乎被Chrome忽略但不是IE?奇怪的过期问题? 302重定向?好的Gawd,你们呀

时间:2011-10-28 20:39:03

标签: asp.net-mvc cookies

我正在使用类似于

的代码通过ASP.NET设置一个带有过期日期的cookie
System.Web.Security.FormsAuthenticationTicket ticket = new System.Web.Security.FormsAuthenticationTicket(1, uname, DateTime.UtcNow, DateTime.UtcNow.AddDays(30), bool_persist, "some custom string data here");

string encrypted_ticket = System.Web.Security.FormsAuthentication.Encrypt(ticket);

HttpCookie auth_cookie = new HttpCookie(System.Web.Security.FormsAuthentication.FormsCookieName, encrypted_ticket);
auth_cookie.HttpOnly = true;

if (persist) //passed in to method as parameter
{
     auth_cookie.Expires = DateTime.UtcNow.AddDays(30);
}
auth_cookie.Domain = ".mydomainname.com";
Response.Cookies.Set(auth_cookie);

我还在同一个请求中设置另一个cookie来保留其他一些数据然后重定向到另一个页面。

以下标题介绍了回复

HTTP/1.1 302 Found
Location: /redirect_to_this_page
Set-Cookie:.myAuthCookie=TRUNCATED_ENCRYPTED_DATA_FOR_READABILITY; domain=.mydomainname.com; expires=Sun, 27-Nov-2011 20:27:16 GMT; path=/; HttpOnly
Set-Cookie:__MyOtherCookie=; domain=full.mydomainname.com; expires=Thu, 28-Oct-2010 20:27:24 GMT; path=/; HttpOnly

/redirect_to_this_page的请求中,我没有看到由于某种原因发送的标头。

Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-US,en;q=0.8
Cache-Control:max-age=0
Connection:keep-alive
Cookie:__utma=113888769.1619895090.1322774580.1322774580.1322774580.1;     __utmb=113888769.5.8.1322774827282; __utmc=113888769;     __utmz=113888769.1319833259.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmv=
Host:full.mydomainname.com
Referer:http://full.mydomainname.com/referring_page_that_set_cookies
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.2 (KHTML, like Gecko)         Chrome/15.0.874.106 Safari/535.2

任何想法如何解决这个问题?每个请求都会设置__MyOtherCookie。

感谢
穆斯塔法


修改

一些发现: IE9正常工作。 如果Cookie具有过期日期,则在获取Set-Cookie标头后,Chrome不会设置该Cookie。

因此,如果我发送cookie没有过期(因此它被浏览器视为会话cookie,在浏览器关闭时被杀死),cookie总是被正确设置并且所有请求都包含正确的cookie。

用Jon Stewart的话来说...... Whaaa?

5 个答案:

答案 0 :(得分:3)

我们在使用Chrome时遇到了同样的问题(版本21.0.1180)。尽管我们看到Header上的截止日期,但Windows XP中的某些Chrome会忽略它。然后我们删除了截止日期,Chrome接受了保持会话cookie没有问题。

答案 1 :(得分:3)

将代码从一台服务器移动到另一台服务器时,我们遇到了类似的症状。登录成功后,我们的登录将在重定向上设置过期的cookie。在新服务器上,Firefox工作正常,但Chrome和Safari失败了(我没试过IE)。所有都在旧服务器上工作。在比较两个案例的标题/响应后,我发现新服务器上的服务器时间已经设置好,以便在设置cookie时cookie过期时提供的时间已经过去了!

我们提供陈旧的饼干。

在新服务器上正确设置时间使其正常工作。

假设:FF有效,因为它将到期时间戳与响应头的Date:值进行比较 - 其他两个必须使用本地机器的OS时间?

答案 2 :(得分:3)

我们有同样的症状。事实证明,即使在服务器上正确设置了日期/时间,IIS也会在HTTP Date标头中将错误的日期返回给浏览器。 IISRESET没有帮助,它需要重启服务器才能修复它。

更新:或使用此方法重置日期:https://github.com/floatinghotpot/cordova-plugin-nativeaudio

答案 3 :(得分:1)

从自定义Cookie中删除域名,然后重试。

如果你想在所有子域名中使用cookie,cookie中的域名必须与在开头点的域匹配,查看你的标题不匹配:

服务器响应有:

full.mydomainname.com

请求有:

full.mydomain.com

或者它可能与那个safari bug Safari doesn't set Cookie but IE / FF does

有关

答案 4 :(得分:0)

为什么使用点作为“.myAuthCookie”的cookie名称前缀?根据RFC it is treated as a separator