如果您保存了cookie的值,注销并重新将该cookie呈现给服务器,它将只会自动登录您,就好像您从未注销过一样。
这是因为您还可以告诉.NET框架设置持久性身份验证cookie(默认情况下,您可以通过Login控件的DisplayRememberMe属性公开的“记住我?”复选框向用户展示此选项)所以到期日将成为未来的价值。
当用户回到网站并且他们的浏览器发送cookie时,它们会自动登录 - 所以您看到的行为是设计。
如果您需要更安全,最简单的方法是在登录控件的OnLoggedIn事件中添加一个方法,并设置一个会话值(即,Session.Add("HasLoggedIn", true)
),您可以再检查其他地方,如果这不是真的,重定向到登录页面:
if (null == Session["HasLoggedIn"] || !(bool)Session["HasLoggedIn"]) {
FormsAuthentication.RedirectToLoginPage();
}
编辑回应评论:
这就是为什么你看到01/01/0001 00:00:00的有效期限 - 在会话结束时将被删除 - 或者当您关闭浏览器时 - 但您看到的内容没有任何根本性错误 - 仅仅因为您不设置永久性Cookie并不意味着如果您将旧Cookie的副本发送回服务器,它不会将您登录到服务器。
正如我所说的,如果您想确保用户每次都必须登录(或“解决”此问题),请添加您在用户实际登录时设置的会话变量,并拒绝所有请求它。
为第二评论
此外编辑从Explained: Forms Authentication:
认证之后接收到后续请求每次,FormsAuthenticationModule类从认证的cookie中检索的认证券进行解密它会计算散列值,并比较MAC值以确保cookie未被篡改。最后,验证表格认证票据内包含的到期时间。
注意 ASP.NET不依赖cookie的截止日期,因为这个日期很容易被伪造。
所以cookie必须在票证过期之前发送回服务器。
你是如何检查cookie的失效日期的? – Phaedrus 2009-11-05 18:01:04
阅读请求和响应Cookie集合 – Jon 2009-11-06 12:15:36