我在简单的庄园中使用ASP.Net登录控件但是我发现ASPXAUTH cookie的失效日期为{01/01/0001 00:00:00}。这不是为了防止黑客操纵吗?我不会自己发布cookie .Net正在创建它。
我在我的网络应用程序上运行扫描,它能够存储ASPX cookie信息,转到注销页面然后转到页面而不需要登录我假设使用存储的cookie信息。
手动使用该应用程序我无法执行此操作,它总是在尝试访问该页面时将我发送到登录页面。
注销页面调用FormsAuthentication.SignOut()
编辑:事实证明这是一个已知问题!谁知道! http://support.microsoft.com/kb/900111
答案 0 :(得分:2)
您无法阅读Cookie过期日期和时间。浏览器使用cookie到期日期来确定是否将cookie发送到服务器。如果cookie已过期,浏览器不会通过页面请求将该cookie发送到服务器,cookie将被删除。
如果cookie未过期,则将cookie发送到服务器sans过期信息,因为浏览器使用此信息来确定是否应该发送cookie。您可以从请求中读取到期日期,但正如您所发现的那样,它会返回日期时间值为零。
尝试在LoggedIn事件中检查Response.Cookies集合的到期日期。这应该会产生cookie的正确到期日期。
protected void Login1_LoggedIn(object sender, System.EventArgs e)
{
HttpCookie cookie = Response.Cookies(".ASPXAUTH");
DateTime expires = cookie.Expires;
}
有关详细信息,请参阅Basics of Cookies in ASP.NET。
答案 1 :(得分:1)
如果您保存cookie的值,注销,然后将该cookie重新呈现给服务器,它将自动登录,就像您从未注销过一样。
这是因为你也可以告诉.NET框架设置一个持久的身份验证cookie(默认情况下,你可以向用户提供这个选项,其中“Remember Me?”复选框显示为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发送回服务器。