Asp.Net - FormsAuthentication ASPXAUTH Cookie ExpiryDate = 01/01/0001 00:00:00

时间:2009-11-05 16:41:43

标签: asp.net forms-authentication

我在简单的庄园中使用ASP.Net登录控件但是我发现ASPXAUTH cookie的失效日期为{01/01/0001 00:00:00}。这不是为了防止黑客操纵吗?我不会自己发布cookie .Net正在创建它。

我在我的网络应用程序上运行扫描,它能够存储ASPX cookie信息,转到注销页面然后转到页面而不需要登录我假设使用存储的cookie信息。

手动使用该应用程序我无法执行此操作,它总是在尝试访问该页面时将我发送到登录页面。

注销页面调用FormsAuthentication.SignOut()

编辑:事实证明这是一个已知问题!谁知道http://support.microsoft.com/kb/900111

2 个答案:

答案 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发送回服务器。