注销后如何使http会话无效
How to invalidate a http session after logout
我正在 asp.net mvc 中创建一个 Web 应用程序,它使用表单身份验证来对用户进行身份验证。
我正在使用 HTTP 代理工具 "burp" 来捕获经过身份验证的用户经过身份验证的 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 工具发送经过身份验证的请求并给出成功响应的屏幕截图
经过大量搜索后,我得出的结果是没有这样正确的方法来使经过身份验证的 cookie 无效。经过身份验证的 cookie“.ASPXAUTH”(身份验证 cookie 的默认名称)基本上只包含用户名、生成时间和过期详细信息。它并不能真正说明用户是否真的通过了身份验证。
如果用户注销,此 cookie 将从浏览器中删除,但如果此 cookie 保存在捕获的某处,它仍将作为经过身份验证的请求。
我找到的唯一解决方案是使用此 cookie 添加一些额外的唯一数据,并将该数据存储在服务器(可能是数据库)的某个位置,并在来自数据库的每个身份验证请求中比较该唯一数据。并且当用户注销时清除数据库中的唯一数据,这将确保如果在用户注销后通过某种方式捕获的经过身份验证的请求命中服务器,则不会在服务器上进行身份验证。
我正在 asp.net mvc 中创建一个 Web 应用程序,它使用表单身份验证来对用户进行身份验证。 我正在使用 HTTP 代理工具 "burp" 来捕获经过身份验证的用户经过身份验证的 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 工具发送经过身份验证的请求并给出成功响应的屏幕截图
经过大量搜索后,我得出的结果是没有这样正确的方法来使经过身份验证的 cookie 无效。经过身份验证的 cookie“.ASPXAUTH”(身份验证 cookie 的默认名称)基本上只包含用户名、生成时间和过期详细信息。它并不能真正说明用户是否真的通过了身份验证。
如果用户注销,此 cookie 将从浏览器中删除,但如果此 cookie 保存在捕获的某处,它仍将作为经过身份验证的请求。
我找到的唯一解决方案是使用此 cookie 添加一些额外的唯一数据,并将该数据存储在服务器(可能是数据库)的某个位置,并在来自数据库的每个身份验证请求中比较该唯一数据。并且当用户注销时清除数据库中的唯一数据,这将确保如果在用户注销后通过某种方式捕获的经过身份验证的请求命中服务器,则不会在服务器上进行身份验证。