c# - 清除 cookie、 session 和 formsauth 后,Asp.net 在注销时摆脱服务器上的 session

标签 c# asp.net session cookies

我遇到了 asp.net 的安全问题。在注销时,我想确保 session 被销毁,这样其他人就无法使用相同的 sessionid 和 auth cookie 并在那里编辑 cookie,而服务器仍然响应 session 。

FormsAuthentication.SignOut();
Session.Abandon();
Session.RemoveAll();
Session.Clear(); 

我也试过向客户端写入新的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);

我已经尝试以不同的顺序使用以下内容,但仍然没有骰子。如果我使用原始 sessionid 和 Auth cookie,我仍然可以登录。我希望服务器在我注销时完全忘记那个 sessionid。这甚至可能吗?

最佳答案

在服务器端没有办法永久清除身份验证 session 。您可以清除 cookie,但如果有人制作了它的副本,他们只需重新使用它就可以访问该站点。 Auth cookies 是加密的验证票,这意味着站点对其进行解密,并验证它们是否正确解密且未过期。如果是这样,则身份验证 cookie 有效。

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

没有与身份验证票关联的“ session ID”,尽管您当然可以生成一个唯一 ID 并将其存储在票中,然后将该 ID 存储在服务器上并在每次请求时对其进行比较以添加额外的层安全。当你想杀死那个 cookie 时,你清除服务器上的任何 ID,他们就不能再登录,即使票证在其他方面是有效的。

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

您还可以通过始终使用加密 cookie 和使用 HTTPS 来增加安全性。 HTTPS 不会以可以获取和重新使用它们的方式存储 cookie(它们使用 SSL session 加密,一旦 SSL session 完成,cookie 将无法使用)。

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

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

关于c# - 清除 cookie、 session 和 formsauth 后,Asp.net 在注销时摆脱服务器上的 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25692085/

相关文章:

c# - 如何删除网络安全创建的用户

c# - 我可以使用 parallel.ForEach 来调用不同的函数吗?

asp.net - 修改特定 gridview 列的数据行值

php - 在php中组合变量

java - 无法在 Hibernate 中创建 session 工厂

node.js - 如何在express.js中启用 session

c# - Protobuf-net 对象引用反序列化使用字典 : A reference-tracked object changed reference during deserialization

c# - 更改 WebBrowser 控件的用户代理

c# - 为 wpf 应用程序设置图标 (VS 08)

asp.net - 我可以在 DefaultModelBinder 上禁用 DataAnnotations 验证吗?