【发布时间】:2016-04-07 21:39:26
【问题描述】:
简短说明: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 并再次尝试对超时没有影响: p>
- 站点=>默认网站=>会话状态=>Cookie 设置=>超时
- 站点=>默认网站=>ASP=>会话属性=>超时
- 站点=>默认网站=>Allstate 应用程序=>ASP=>会话属性=>超时
确实有所作为的唯一因素是:
- 应用程序池 => 高级设置 => 进程模型 => 空闲超时
但这是因为它在另一个超时之前开始并重置所有内容,而不是它是导致我们想要删除的那个的原因。在我们的系统中,此超时通常被禁用(根据 MSDN 指南设置为 0 分钟)。
我已经浏览了我能想到的所有内容 - 这绝对是一个 IIS 问题,因为无论是否过期,服务器端代码都在执行完全相同的任务,唯一的区别是 HTTP_COOKIE 字符串在上面之后消失了空闲时间,因此它会生成一个新的 GUID,因为它找不到现有的 GUID。事件日志中没有错误表明某些内容已用完空间或以其他方式失败导致重置。
我要问的是是否有人知道其他可以控制它的东西,以及在哪里可以禁用/修改为更大的值。如果您知道这是什么并且知道它是不可能绕过的,那么知道这也是有用的。如果是这种情况,如果有人对存储用户会话的 GUID 的更好方法提出建议,他们也将不胜感激!
提前致谢。
附:如果涉及到系统的完全重写,我并不是在寻找更好的方法来处理这个问题 - 现有的系统过于复杂,但应用程序已经过时(约 15 年)并且包含许多我们正在使用的过时方法没有资源来整理,所以我唯一的选择就是按原样使用系统。
【问题讨论】:
-
来吧人们! 有人肯定知道一些事情!
-
生成 cookie 的服务器上的代码是什么样的?听起来cookie只是在客户端过期,此时客户端将停止在后续请求中发送它......
-
客户端上的 cookie 很可能会过期(这几乎可以肯定是通过某种方法发生的,无论是 cookie 本身还是会话),问题是为什么。据我所知,我们已经涵盖了我们可以找到的每个超时或默认到期时间,我正在寻找的是导致它(cookie 或会话,无论它是什么)在 20-30 分钟后到期的确切原因
-
如果您正在检查 cookie 中的 GUID 值,那么必须在某个时候将该 GUID 值放入 cookie 中。生成 cookie 的应用程序中的代码是什么样的?例如,它是否包括到期时间?
-
在这种情况下,代码不会有太大帮助 - cookie 字符串(包括 GUID)被生成,然后使用
HSE_REQ_SEND_RESPONSE_HEADER_EX支持函数发送到 IIS 请求。然后数据一直保留在那里,直到它被我们无法放置的超时/到期神秘地清除,这就是我正在寻找答案的地方。 cookie 中没有包含到期时间,根据 IIS 文档,这意味着它应该使用默认值,即会话到期/结束,这应该是选项卡的关闭。我现在正在运行测试,手动定义 cookie 过期时间
标签: asp.net session iis server-variables