我正在开发一个用 Laravel 制作的网络应用程序,遇到了一个奇怪的问题。 SESSION_LIFETIME 设置为 30 分钟,因此我在前端有一个脚本,用于在 30 分钟结束前 3 分钟检查用户在会话中的剩余时间。这是通过每次用户执行操作时在后端设置 session_expires_at 变量来完成的。 过期时间的计算方式如下 Now + SESSION_LIFETIME
主要问题是用户在 30 分钟结束之前以某种方式注销。如果我将生命周期设置为 20 分钟,就没有问题。
我通过添加一些日志来测试这一点
[2021-10-22 17:32:01] testing.INFO: Reached CheckOktaTokenForWeb
[2021-10-22 17:32:01] testing.INFO: 2021-10-22 17:32
[2021-10-22 17:32:01] testing.INFO: Session expires at: 2021-10-22 18:02
[2021-10-22 17:32:01] testing.INFO: Okta token is valid
[2021-10-22 17:59:01] testing.INFO: Reached VerifyCsrfToken
[2021-10-22 17:59:01] testing.INFO: 2021-10-22 17:59
[2021-10-22 17:59:01] testing.INFO: Session Lifetime: 30
[2021-10-22 17:59:01] testing.INFO: User is authenticated? No
[2021-10-22 17:59:01] testing.INFO: Reached VerifyCsrfToken
[2021-10-22 17:59:01] testing.INFO: 2021-10-22 17:59
[2021-10-22 17:59:01] testing.INFO: Session Lifetime: 30
[2021-10-22 17:59:01] testing.INFO: User is authenticated? No
[2021-10-22 17:59:01] testing.INFO: Reached VerifyCsrfToken
[2021-10-22 17:59:01] testing.INFO: 2021-10-22 17:59
[2021-10-22 17:59:01] testing.INFO: Session Lifetime: 30
[2021-10-22 17:59:01] testing.INFO: User is authenticated? No
从日志中您可以看到,在会话生命周期结束前 3 分钟,用户未经过身份验证。用户在这两个时间段之间没有执行任何操作,因此有些东西将他注销,但我完全不知道是什么。
CheckOktaTokenForWeb 是一个自定义中间件,在 Laravel 的 Auth 中间件之后调用,该中间件仅检查第三方身份验证令牌,这也是我设置 session_expires_at 属性的地方。
还有什么可能导致用户在 30 分钟过去之前注销并给我一个令牌不匹配错误?正如我所说,如果我将会话生命周期设置为 20 分钟,没问题。
罪魁祸首是 php.ini 中的
session.gc_maxlifetime
设置被设置为 24 分钟。
您检查过 IIS 设置吗?有一个空闲超时设置(转到应用程序池 - 高级设置 - 进程模型),它会覆盖您的 web.config 和 javascript