【问题标题】:ASP.NET session variables leaking between users sessionsASP.NET 会话变量在用户会话之间泄漏
【发布时间】:2018-09-05 03:57:42
【问题描述】:

当用户浏览我的网站时,我最初使用静态变量来存储一些用户信息。我遇到了一些问题,有时用户会在某个地方导航并在页面上看到不同的用户名。我切换到使用会话变量来解决这个问题,但发生了同样的问题。然后我认为以某种方式使会话变量名称唯一可以解决问题,例如而不是

Session["userId"]

我更改了所有会话变量以在创建和引用用户时附加用户的唯一用户名,因此它们是:

Session["userId" + Context.Identity.User.Name.ToString()] 

到目前为止,我还没有收到有关此问题的报告,但这真的可行吗?有没有一种简单的方法来保护会话,使变量不会在用户之间泄漏?我对ASP.NET 代码(特别是webforms)很有信心,但随着越来越多的用户使用该站点,我只遇到了会话问题。由于该站点是通过AWS Elastic Beanstalk 构建的,因此我对 IIS 设置没有太多控制权,因此它主要是默认的 IIS 设置。

【问题讨论】:

  • 网络应用程序中的静态变量是有问题的(正如您所发现的),因为它是 一个 应用程序(共享静态数据)为多个用户服务。会话被设计为特定于用户(或浏览器,实际上)。你确定你替换了所有的静态元素吗?
  • 我很确定。我只有一个包含用户属性和其他与站点功能相关的临时属性的静态类。我在整个过程中都用会话变量替换了它,并对静态对象进行了“查找所有引用”,但没有找到。网站很小,代码库很小,所以我很有信心,但我会重新检查

标签: asp.net session-variables session-state


【解决方案1】:

这应该可以正常工作,但我建议将用户名或用户配置文件信息存储在 cookie 或本地存储中,因为正如您所提到的,当许多用户登录时,它会在服务器内存上为他们维护会话(我相信会话默认情况下是在内存中不是进程内或redis)。这是不可扩展的,就像数百万用户登录或您创建负载测试服务器一样,会话管理将占用大量内存。然而,几百个用户的开销并不大。

您可以使用 sessionStorage 在用户浏览器中存储信息,例如:

设定值

sessionStorage.setItem("user_name", "test");

获取价值

var userName = sessionStorage.getItem("user_name");

它也可以存储javascript对象或json。

Cookie 是在用户端存储信息的旧方式:

创建 cookie

document.userCookie = "username=John Doe";

阅读 cookie

document.userCookie //"username=John Doe"

表单身份验证还提供加密和安全的 cookie,该 cookie 由会话维护,如果用户个人资料信息是敏感数据,这也很好。

【讨论】:

  • 这是 client-side 存储,而 OP 显然想要存储 server-side
  • 在我看来,OP 需要存储用户配置文件并不局限于服务器或客户端。我有同样的事情,但是当用户增加时,我必须将其移动到客户端以获得性能,所以建议相同
  • 我已经进行了一些搜索,但找不到任何用于使用会话存储的 C#/ASP.NET 类? (当地的)。但是,我可以找到 javascript 参考。我不是 javascript 大师,所以不知道如何实现这个?我想我可以使用 cookie,但除了通过 OWIN 中间件之类的系统生成的表单之外,我还没有使用自定义 cookie,所以我担心我会保留数据太久,它会搞砸网站。
  • cookie 只是在客户端位置创建的文件。它仅在您阅读时使用。它可以是有时限的,也可以是永恒的。通常,如果没有设置任何内容,它会在用户会话关闭时自行删除,所以我看不到任何性能问题。您使用的是表单身份验证还是 Oauth ?或者用户资料(存储在 cookie 中)是否有任何与个人身份数据相关的内容?答案取决于那个
【解决方案2】:

抱歉,我无法为您的问题编写 cmets,但是: 使用 AWS Elastic Beanstalk 的 Java 开发人员也遇到了同样的问题: https://forums.aws.amazon.com/thread.jspa?threadID=84027 首先,我建议您尝试为您的 HttpResponse 设置 no-cache (临时解决方案),而不是 我建议您尝试使用 IIS 代理设置。

如果它没有帮助(并且您正在使用负载平衡器) - 拒绝使用本主题中的 inproc 设置: User on wrong session

PS。您确实不必使会话变量名称不同 - ASP.NET 为每个会话设置不同的 Session_ID 来保证会话的唯一性。

【讨论】:

  • 谢谢 Alexey,但如果这是真的,为什么我首先会遇到这个问题?
  • 这可能有很多原因:你的 cookie 被缓存了:blogs.msdn.microsoft.com/friis/2011/08/30/… 或者你使用负载均衡器,所以你的会话存储在不同的线程中,他们不知道哪个 Session_ID 其他创建的线程和它是 Session_ID 冲突的来源 - 这是最常见的
  • 嗨,Alexey,我正在使用负载均衡器,但它背后仍然只有一个实例/Web 服务器。我仍然会看到只有一台机器进行负载平衡的问题吗?如果是这种情况,我该如何解决? (我可以在负载均衡器上启用粘性会话,但没有,因为我一直没有看到这一点,只有一个实例)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-02-13
  • 1970-01-01
  • 2012-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多