2009-11-05 79 views
4

我在一个简单的庄园中使用ASP.Net登录控件,但是我发现ASPXAUTH cookie的终止日期为{01/01/0001 00:00:00}。这应该不是为了防止黑客操纵?我自己并不发布cookie,而是让.NET创建它。Asp.Net - FormsAuthentication ASPXAUTH Cookie ExpiryDate = 01/01/0001 00:00:00

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

手动使用应用程序我无法做到这一点,它总是在尝试访问页面时将我发送到登录页面。

登出页面调用FormsAuthentication.SignOut()

编辑:原来这是一个已知的问题!谁知道http://support.microsoft.com/kb/900111

+1

你是如何检查cookie的失效日期的? – Phaedrus 2009-11-05 18:01:04

+0

阅读请求和响应Cookie集合 – Jon 2009-11-06 12:15:36

回答

1

如果您保存了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必须在票证过期之前发送回服务器。

+0

DisplayRememberMe为false,因此不存在持久性Cookie – Jon 2009-11-06 12:14:59

+0

但是,SignOut应该删除Cookie,以便您不能重新登录?这不是一个带有FormsAuthentication的巨大安全漏洞 - 即只是复制一个cookie值,即使你已经注销,你可以发送cookie值回来,它会登录你? – Jon 2009-11-06 16:22:28

+0

感谢您的信息,但如果你看到我的编辑,这也回答了我的问题的一部分,即如果你复制一次认证的cookie值,然后即使SignOut被调用,你仍然可以使用受保护的页面,FormsAuthentication可以被绕过 – Jon 2009-11-07 15:05:16

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

+0

好吧我认为我明白,但是阅读Response.Cookie到期日期在LoggedIn事件中也是零 – Jon 2009-11-06 12:13:53

+0

Zhaph - Ben Duguid是正确的,有效期限是01/01/0001 00 :00:00是因为您正在发行非永久性Cookie。尝试将Login控件的'RememberMeSet'属性设置为true,然后检查LoggedIn事件中的过期时间。请记住,正如Zhaph所述,在用户的浏览器上设置持久身份验证Cookie存在安全风险。 – Phaedrus 2009-11-06 15:50:07

相关问题