我有一个页面,用户可以在其中通过 Web 服务登录到后端应用程序。 Web 服务返回一个 session ID,我想将其存储在 cookie 中 40 分钟,因为 40 分钟后后端应用程序会自动关闭 session 。
我编写 cookie 的代码:
private void SetCookie()
{
Response.Cookies.Add(new HttpCookie("Cookie_SessionID"));
Response.Cookies["Cookie_SessionID"].Value = ni.NicheSessionID;
Response.Cookies["Cookie_SessionID"].Expires = DateTime.Now.AddMinutes(40);
//.... after a few more things
Response.Redirect(returnUrl);
}
然后在接收页面上我有这个:
private HttpCookie GetCookie()
{
HttpCookie cookie = Request.Cookies["Cookie_SessionID"];
if (cookie != null && cookie.Value != null)
{
return cookie;
}
return null;
}
出于某种原因,GetCookie()
返回的 cookie 始终具有 Expires
值 0001-01-01 00:00:00
,即使当我在浏览器中查看 cookie 时它具有正确的到期时间。
已阅读this哪些状态过期的 cookie 根本没有发送到服务器,我假设可能发生的情况是 cookie 被正确写入但浏览器没有发送到期日期,因为这实际上是不必要的?...
我的问题是,我想准确地捕捉到这一点——cookie 已经“过期”,因此他们必须重新登录——但我需要显示一条消息,如“我知道你已经登录了,但你“需要再做一次”类型的东西。
谢谢
最佳答案
除了 cookie 的名称和值,浏览器不会向服务器发送任何内容。设置 cookie 后,无法根据请求检索所有其他属性(expires、domain、path、httponly,...)。
如果你想显示这样的消息,那么你需要一些其他的机制来检测用户是否登录。你可以设置一个状态 cookie 一年左右,然后检查它是否存在。
处理此问题的更可接受的方法是在用户尝试访问 protected 资源时将用户重定向到登录页面,并显示类似“您需要登录才能查看此页面。如果您是之前登录过,您的 session 可能已过期。”
(另请注意,您应该在每次请求时重新设置 cookie,以便用户在继续使用该网站时不会被注销。从您的代码中不清楚您是否正在这样做。 )
关于C# Cookie - Expires 属性不会设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8669929/