4

简短描述:IIS 服务器变量“HTTP_COOKIE”的到期时间似乎不受任何超时变量的控制,我想知道是什么原因造成的。我已经尝试修改我可以在 IIS 中看到的所有超时/到期控制值,并且在大约 20-30 分钟内没有任何改变。

详情

我们有一个带有 C++ 后端的应用程序,它使用 IIS 服务器变量“HTTP_COOKIE”来存储状态数据,最重要的是该用户当前会话的会话 ID(GUID,用于问题的其余部分)。要求任何用户只能登录一次,而 GUID 是用于强制执行此操作的数据之一 - 每次用户登录时,都会刷新 GUID。每次用户完成一项操作时,都会根据最近为该用户创建的 GUID 检查本地存储在选项卡 sessionStorage 中的 GUID(即,用户首次登录该选项卡时的值)。如果它们不匹配,则用户将被踢出该选项卡上的应用程序。

现在,问题在于有两种情况会刷新 GUID:当用户登录时,以及当应用程序无法在其内存中找到现有的 GUID 或 HTTP_COOKIE 字符串时。案例 1 很好——这就是我们想要的。情况 2 很烦人,因为 IIS 设置中似乎有一些东西导致 HTTP_COOKIE 在 20-30 分钟后被清除(我还没有确定它到底有多长)。我们看了看,我们发现很多超时都可能导致这种情况,但是将每个超时修改为 1 分钟,重置 IIS 并再次尝试对超时没有任何影响:

  • 站点=>默认网站=>会话状态=>Cookie 设置=>超时
  • 站点=>默认网站=>ASP=>会话属性=>超时
  • 站点=>默认网站=>Allstate 应用程序=>ASP=>会话属性=>超时

唯一有所作为的是:

  • 应用程序池 => 高级设置 => 进程模型 => 空闲超时

但这是因为它在另一个超时之前启动并重置所有内容,而不是它是导致我们想要删除的那个的原因。在我们的系统中,此超时通常被禁用(根据 MSDN 指南设置为 0 分钟)。

我已经浏览了我能想到的所有内容 - 这绝对是一个 IIS 问题,因为无论是否过期,服务器端代码都在执行完全相同的任务,唯一的区别是 HTTP_COOKIE 字符串在上述空闲时间之后消失了,因此它会生成一个新的 GUID,因为它找不到现有的 GUID。事件日志中没有错误表明某些内容已用完空间或以其他方式失败导致重置。

我要问的是是否有人知道其他可以控制它的东西,以及可以在哪里禁用/修改为更大的值。如果您知道这是什么并且知道它是不可能绕过的,那么知道这也是有用的。如果是这种情况,如果有人对存储用户会话的 GUID 的更好方法提出建议,他们也将不胜感激!

提前致谢。

PS 如果涉及到系统的完全重写,我并不是在寻找更好的方法来处理这个问题——现有的系统过于复杂,但应用程序已经过时(约 15 年),并且包含了很多我们认为过时的方法。我没有得到资源来整理,所以我唯一的选择就是按原样使用系统。

4

2 回答 2

1

HTTP_COOKIE 只是通过请求/响应标头传递的连接字符串,用于存储在客户端上的该域的所有有效cookie。您基本上会受到会话 ID 的默认超时的影响。只需创建您自己的会话标识符(例如,生成存储在数据库表中的 GUID)并让客户端将其存储为具有不同到期日期的 cookie。使用每个有效的用户交互更新到期日期以延长会话。问题解决了。

于 2016-01-08T01:03:41.980 回答
0

您确定会话 cookie 即将过期并且所有浏览器中的问题都一致吗?

我遇到了一些问题,其中应用程序有一些致命错误或服务器上的内存已满 & AppPool 崩溃因此会话重置本身。请在此期间使用 Perfmon 监控服务器日志,可能会出现一些致命错误、应用程序错误、IIS 错误或系统错误。

我已经像这样挣扎了很长时间,最后 cultprit 是致命错误,由于有时 AppPool 崩溃,因此使用该 AppPool 托管在 IIS 上的所有应用程序也会重置,因此这些应用程序的会话被破坏。

于 2016-01-13T08:18:51.237 回答