HTTP_COOKIE IIS 服务器变量因未知原因过期

HTTP_COOKIE IIS Server Variable expiring for unknown reason

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

详情:

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

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

唯一有所作为的是:

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

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

我想问的是是否有人知道可以控制它的任何其他东西,以及它可以 disabled/modified 到更大的值。如果您知道这是什么并且知道绕过它是不可能的,那么了解它也会很有用。如果是这种情况,如果有人对存储用户会话的 GUID 的更好方法有建议,我们也将不胜感激!

提前致谢。

P.S。如果它涉及对系统的完全重写,我不会寻找更好的方法来处理这个问题 - 现有的系统不必要地复杂,但应用程序已经过时(约 15 年)并且包含许多我们正在使用的陈旧方法没有得到整理的资源,所以我唯一的选择就是按原样使用系统。

HTTP_COOKIE 只是通过 request/response headers 传递给客户端上存储的该域的所有 有效 cookie 的串联字符串。您基本上会受到 Session ID 的默认超时的影响。只需创建您自己的 session 标识符(例如生成存储在数据库 table 中的 GUID)并让客户端将其存储为具有不同到期日期的 cookie。通过每次有效的用户交互更新到期日期以延长 session。问题已解决。

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

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

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