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

时间:2015-11-19 17:19:19

标签: c# asp.net-mvc login

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

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

1 个答案:

答案 0 :(得分:2)

关于身份验证和会话在这里如何实际工作似乎存在一些混淆。

首先,会话使用cookie。这就是他们的工作方式。使用会话标识符设置cookie,以便服务器可以检索每个后续请求的适当会话。唯一的选择是什么称为"无cookie会话",其中会话标识符作为查询字符串参数传递。但是,这些通常是不鼓励的,因为URL不可避免地泄漏,并且很容易以这种方式劫持用户会话。

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

第三,会话存储的机制不同。默认值,因为它不需要配置,是什么叫做" in-proc"。这意味着会话数据由Web服务器进程存储在内存中。当Web服务器进程终止时,将释放其内存块以及会话数据。持久会话需要持久存储,这意味着类似于数据库。

无论多长时间,您所做的事情都没有错,您只是没有正确配置您的会话。请参阅MSDN docs on the <sessionState> Web.config element。您需要添加类似于:

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