我在使用.Expires cookie属性时遇到问题。当我读回cookie时,它会在01/01/0001 12:00 AM回来。
这是代码。我在保存下方的检索中添加了仅用于调试目的。保存和检索发生在同一文件的不同位置。我故意没有指定域,因为我希望cookie在网站范围内存在。
数据很好地显示,而不是过期。
注意:我正在使用.Net Framework 4在本地主机下运行的Visual Studio 2012下进行测试。
System.Web.UI.Page oPage = this.Page;
HttpCookie oCookie = new HttpCookie("UserData");
// Set the cookie value.
oCookie.Secure = false;
oCookie["Field1"] = strField1;
oCookie["Field2"] = strField2;
oCookie.Expires = DateTime.Now.AddDays(1);
// Add the cookie.
oPage.Response.Cookies.Add(oCookie);
// Get the cookie.
oCookie = new HttpCookie("UserData");
oCookie = oPage.Request.Cookies["UserData"];
答案 0 :(得分:4)
除了cookie名称和值之外,浏览器不会向服务器发送任何内容。设置cookie后,无法在请求中检索所有其他属性(expires,domain,path,httponly,...)。
更可接受的解决方法是在用户尝试访问受保护资源时将用户重定向到登录页面,并显示“您需要登录才能查看此页面”的消息。如果您是以前登录过,您的会话可能已过期。“
(另请注意,您应该在每次请求时重新设置cookie,以便在用户继续使用该网站时不会注销。从您的代码中不清楚您是否这样做。 )
答案 1 :(得分:1)
我正在做更多Google搜索我的问题并看到了这个链接,另一个帖子在Stackoverflow上。
我也在验证使用构造:
if (cookie != null && cookie.Expires > DateTime.Now)...
正如几位指出的那样,如果您无法再检索cookie,则会发生过期检查。对于构建这种架构的人来说,这是非常愚蠢的。是的,也许应该有RequestCookie和ResponseCookie,区别在于ResponseCookie没有到期日期。
转到我身边的人告诉我,这不仅仅是过期而是其他领域。
答案 2 :(得分:0)
在C#代码中,如果使用表单身份验证,则可以使用以下代码查找cookie是否持久化
bool IsCookiePersistent = ((FormsIdentity)User.Identity).Ticket.IsPersistent;
此处Ticket
将返回具有FormsAuthenticationTicket
DateTime属性的Expiration
。