除了保存上次登录日期和时间之外,我是否需要在数据库中保存每个用户的唯一会话 ID(将上次会话 ID 保存在用户表中并检查用户是否具有有效会话)。
不,您没有,因为用户在连接到数据库时可能有多个会话。
用户可以轻松进入私有浏览器实例并访问该站点。中提琴,新的会话。
您并没有真正获得安全优势来检查会话 ID 是否匹配,最重要的是,您必须挂钩会话结束事件并从数据库中擦除最后一个会话 ID;如果用户的会话超时并且他们稍后回来,他们的会话 ID 将不同并且有效。
在用户注销或关闭窗口之前(无论他将窗口打开多长时间),保持用户会话处于活动状态是一种好习惯吗?
您可以通过在页面中使用 AJAX 回调来保持会话处于活动状态,该回调会在会话超时之前 ping 服务器。
但是,我会说这是绝对不行的。这是一个安全问题。如果有人让工作站保持打开状态,并且页面打开,那么其他人可以访问该用户下的站点。
即使用户忘记关闭浏览器并让工作站保持打开状态,至少会话会超时并且用户无法访问该站点。
当然,假设场景不使用 Internet Explorer,它会自动将登录用户的凭据传递给站点。但是,如果使用其他浏览器(Safari、Firefox、Chrome),则仍会使用 Windows 凭据,但会向用户显示用户名/密码对话框,因此您会在此处获得少量安全性。
一般来说,保持会话超时。除非你有充分的理由,否则不要绕过它。
通常会话级别的详细信息保存在用户通过用户登录名和密码进入系统的数据库中,但在我的应用程序中没有登录页面。
您不应该做任何事情来主动链接数据库中的会话,除非它仅用于跟踪目的。当用户登录到您的应用程序时,您正在与用户打交道,您不关心根据他们拥有的会话 ID 做出选择(该数字是随机的并且对于此任务没有意义),您希望在用户.