如何在注销后使 http 会话无效

4
我正在创建一个使用ASP.NET MVC的Web应用程序,该应用程序使用表单验证来验证用户。我正在使用一个名为“Burp”的HTTP代理工具来捕获已验证用户的身份验证cookie。之后,我从应用程序中注销。现在,我正在使用捕获的身份验证cookie向服务器发送请求,并且服务器将该请求视为已验证请求(即使该用户已从我的浏览器注销)。请问有人能告诉我我在注销代码中哪里出错了吗?
以下是我的应用程序注销代码:
  public virtual ActionResult LogOff()
    {
        FormsAuthentication.SignOut();
        Session.Abandon();

        // clear authentication cookie
        HttpCookie cookie1 = new HttpCookie(FormsAuthentication.FormsCookieName, "");
        cookie1.Expires = DateTime.Now.AddYears(-1);
        Response.Cookies.Add(cookie1);

        // clear session cookie 
        HttpCookie cookie2 = new HttpCookie("ASP.NET_SessionId", "");
        cookie2.Expires = DateTime.Now.AddYears(-1);
        Response.Cookies.Add(cookie2);

        HttpCookie cookie3 = new HttpCookie("__RequestVerificationToken", "");
        cookie3.Expires = DateTime.Now.AddYears(-1);
        Response.Cookies.Add(cookie3);

        HttpCookie cookie4 = new HttpCookie(".ASPXAUTH", "");
        cookie4.Expires = DateTime.Now.AddYears(-1);
        Response.Cookies.Add(cookie4);


        return RedirectToAction(MVC.Account.Login());
    }

以下是Burp工具发送身份验证请求并获得成功响应的屏幕截图:

Below is the screen shot of burp tool to send authenticated request which gives success response


我注意到你针对 cookie3cookie4 又将 cookie2 的属性设置为了过期,这是有意为之吗? - Guruprasad J Rao
你能展示一下如何使用已捕获的身份验证 cookie 向你的服务器发送请求以及何时执行此操作的代码吗? - Guruprasad J Rao
你能否发布一下设置cookie的代码:FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe); - Ganesh Todkar
2
@GuruprasadRao 我没有通过代码发送经过身份验证的请求。我使用的HTTP代理工具“Burp”用于捕获请求,它有一个名为“重复器”的功能,我正在使用该功能发送请求。我已经在我的问题中添加了屏幕截图。 - Abhishek
@GaneshTodkar 这是我设置身份验证 cookie 的代码 FormsAuthentication.SetAuthCookie(username, true); - Abhishek
1个回答

9
经过大量搜索我得出的结果是,没有一种合适的方法来使已认证的cookie失效。已认证的cookie“ .ASPXAUTH”(默认的身份验证cookie名称),基本上只包含用户名、生成时间和过期详细信息,并不真正说明用户是否真正已经通过了身份验证。
如果用户退出登录,则该cookie将从浏览器中删除,但如果该cookie被某个地方捕获并保留下来,它仍将作为已验证请求进行服务。
我发现的唯一解决方案是,在此cookie中添加一些额外的唯一数据,并将该数据存储在服务器上(通常是数据库)并在每个身份验证请求中从数据库比较该唯一数据。当用户注销时,请清除数据库中的该唯一数据,这将确保如果某种方式捕获到一个已通过身份验证的请求会在用户注销后击中服务器,也不会在服务器上通过身份验证。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接