从Web应用程序中记录某人的最佳方法是什么?

时间:2013-05-28 21:49:39

标签: c# asp.net security session-state fiddler

我有一个需要用户名和密码的应用程序。当用户单击注销按钮时,它将运行:

private void LogOut()
{
    Session["SessionName"] = null;
    Session.Remove("SessionName");
    System.Web.Security.FormsAuthentication.SignOut();

    Response.Cookies.Remove("AuthCookie");
    HttpCookie c = new HttpCookie("AuthCookie");
    c.Expires = DateTime.Now.AddYears(-1);
    Response.Cookies.Add(c);

    Session.Clear();
    Response.Cache.SetCacheability(HttpCacheability.NoCache);
    Response.Cache.SetExpires(DateTime.Now.AddDays(-1));
    Response.Cache.SetNoStore();
    Response.Cache.SetNoServerCaching();

    Session.Abandon();

    Response.Redirect("~/user/login.aspx");
}

问题在于我测试安全性。当我转到页面来更改数据库中的数据时,我可以使用Fiddler来“记录”此请求。 在我退出应用程序之后,我仍然可以在Fiddler中重播此请求,就像我仍然登录一样。事实上,当我放置中断时,我仍然可以看到所有cookie和会话信息我的代码。只有在会话到期后(从超时),实际会话才会消失。

为什么在我过期cookie并放弃会话后仍能看到此信息?当用户点击注销按钮时,如何完全清除cookie和会话信息?

1 个答案:

答案 0 :(得分:4)

根据MSDN(http://msdn.microsoft.com/en-us/library/system.web.security.formsauthentication.signout.aspx),

  

调用SignOut方法只会删除表单身份验证Cookie。 Web服务器不存储有效和过期的身份验证票证以供以后进行比较。如果恶意用户获得有效的表单身份验证cookie,这会使您的站点容易受到重播攻击。

他们提供了三种方法来缓解这种风险。只有最后一种方法(使用持久存储来自己跟踪登录状态)将阻止实际用户重放请求。第一种方法只是缩短了漏洞的时间窗口,第二种方法使cookie不受第三方的影响。