MVC 5在浏览器重新启动时保持用户记录

本文关键字:用户 记录 重新启动 浏览器 MVC | 更新日期: 2023-09-27 18:23:41

首先,我是MVC的新手,但我设法使用实体框架、MVC 5和C#创建了一个简单的自定义登录。(我不想使用Identity,因为这个想法是为了了解它背后的功能)。

我目前正在使用会话变量进行此操作,因此当用户存在于数据库中时,我会将角色、名称等信息存储在会话变量中,但当用户关闭浏览器或重新启动应用程序时,会话将丢失,因此用户必须再次登录,我如何防止这种情况发生,并像Identity一样保持用户登录?

MVC 5在浏览器重新启动时保持用户记录

这里似乎对身份验证和会话的实际工作方式有些困惑。

首先,会话使用cookie。他们就是这样工作的。cookie设置有会话标识符,以便服务器可以在每个后续请求中检索适当的会话。唯一的替代方案是所谓的"无cookie会话",其中会话标识符作为查询字符串参数传递。然而,通常不鼓励这样做,因为URL不可避免地会泄漏,而且这种方式很容易劫持用户会话。

其次,服务器上的会话与浏览器的"会话"是不一样的。服务器端会话在关闭浏览器时不会过期。这显然是错误的。但是,可以将包含会话标识符的cookie设置为"会话cookie",这会导致cookie本身在浏览器会话结束时过期。服务器会话仍然存在,只是没有cookie,就无法查找它。然而,您可以很容易地让cookie在几天或几周后过期。事实上,它是一个用于维护会话的cookie,这并不意味着它必须是"会话cookie"。

第三,有不同的会话存储机制。默认情况下,因为它不需要配置,所以被称为"in proc"。这意味着会话数据由网络服务器进程存储在内存中。当web服务器进程终止时,它的内存块和会话数据将被释放。持久会话需要持久存储,这意味着类似于数据库。

总之,你所做的并没有错,只是你的会话配置不正确。请参阅<sessionState> Web.config元素上的MSDN文档。你需要添加类似的东西:

<sessionState mode="SQLServer"
              cookieless="false"
              timeout="3600"
              sqlConnectionString="[Connection String Here]" />