清除cookie,session和formsauth后,Asp.net在注销时删除服务器上的会话

Mic*_*out 2 c# asp.net cookies session

我遇到了asp.net的安全问题.在注销时,我想确保会话被销毁,以便有人不能使用相同的sessionid和auth cookie并在那里编辑cookie,服务器仍然会响应会话.

FormsAuthentication.SignOut();
Session.Abandon();
Session.RemoveAll();
Session.Clear(); 
Run Code Online (Sandbox Code Playgroud)

我也试图给客户写新的cookie

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

HttpCookie cookie2 = new HttpCookie("ASP.NET_SessionId", "");
cookie2.Expires = DateTime.Now.AddYears(-1);
Response.Cookies.Add(cookie2);
Run Code Online (Sandbox Code Playgroud)

我尝试过在不同的订单中使用以下内容,但仍然没有骰子.如果我使用原始的sessionid和Auth cookie,我仍然可以登录.我希望服务器在我注销时完全忘记该sessionid.这甚至可能吗?

Eri*_*sch 6

在服务器端,无法永久清除身份验证会话.您可以清除cookie,但如果有人复制了它,他们可以简单地重复使用它,他们就可以访问该网站.Auth cookie是加密的验证票证,这意味着站点对它们进行解密,并验证它们是否正确解密且未过期.如果是这种情况,则auth cookie有效.

不幸的是,除了使用短期过期值并在滑动窗口上更新到期日期之外,没有办法解决这个问题,但这意味着如果用户闲置几分钟,他们将不得不再次登录.

没有与身份验证票证关联的"会话ID",尽管您当然可以生成唯一ID并将其存储在票证中,然后将该ID存储在服务器上并在每个请求上进行比较以添加额外的安全层.当您要杀死该cookie时,您清除服务器上的任何ID,并且即使该票证有效,它们也无法再登录.

另一方面,会话cookie确实有id,并且与映射到该ID的内部存储相关联,因此当您清除会话时,还会删除存储...如果您重复使用该cookie,那么它只会获取空数据.

您还可以通过始终使用加密的Cookie并使用HTTPS来添加更多安全性.HTTPS不会以可以获取和重新使用它们的方式存储cookie(它们使用SSL会话加密,一旦SSL会话完成,cookie就无法使用).

另一个选择是使用非持久性cookie,它们不会存储在服务器上......尽管在中间攻击中它们仍然可以被人捕获.

要理解无法解决问题的原因,您必须了解身份验证cookie应该存在很长时间并存储在用户计算机上.当您回来时,它可以是不同的会话.因此,了解用户是否经过身份验证的唯一方法是简单地依赖于是否可以使用服务器凭据(通常是机器密钥)来解密cookie.这意味着会话和身份验证票据之间故意没有链接.