.NET Session - 持久会话,即使用户关闭浏览器也是如此

时间:2012-03-21 20:55:08

标签: c# login session-state .net

我们使用.net framework 3.5和C#。

我们有一个网站要求用户登录。所以我们使用数据库检查登录名/密码是否正确。

然后我们调用 FormsAuthentication.SetAuthCookie() ,这样用户就可以登录我的应用程序了。

在所有后续页面中,如果用户已登录,我们会检查 User.Identity.IsAuthenticated()

我们希望保留此会话,即使用户关闭了borwser。

最好的方法是什么?

我们也遇到了丢失会话的问题,突然用户失去了他的身份验证状态,我认为通过这种新的持久性我们也可以解决这个问题。

(对不起我的英语......葡萄牙语发言人)

2 个答案:

答案 0 :(得分:6)

你不应该混淆术语,记住你在asp.net中同时拥有认证cookie和会话状态。

您似乎在寻找持久的身份验证Cookie。有一个持久的身份验证cookie尝试

FormsAuthentication.SetAuthCookie("xxx",true); 

http://msdn.microsoft.com/en-us/library/twk5762b(v=vs.90).aspx

传递true将允许身份验证cookie在浏览器重新启动后继续存在。 您还应该考虑web.config

中表单身份验证和会话的超时值
<authentication mode="Forms">
        <!-- The name, protection, and path attributes must match 
       exactly in each Web.config file. -->
        <forms loginUrl="Default.aspx" name=".ASPXFORMSAUTH" protection="All" path="/" timeout="360"/>
    </authentication>

<sessionState mode="InProc" timeout="360" />

答案 1 :(得分:1)

我建议使用更简洁的方法来存储会话信息。当然,Shay用于持久化身份验证cookie的方法是正确,但在将应用程序扩展到多个并发用户时,长时间存储sessionState会有严重的缺陷。

首先,澄清一下,会话状态实际上意味着您可以通过Session[]集合访问的任何内容。

我看到一个大型银行成功使用*的更好的技术是在数据库中存储持久性会话相关信息。

基本上你需要

  1. 一个primaryforeign用户ID的表,a)与您需要存储的变量一样多的列,或者b)一个包含序列化值的BLOB列类
  2. A PersistentSession
  3. 在Global.asax Session_Start或更好的Application_PostAuthenticateRequest方法中填充该对象,并将其保存在Session对象
  4. 将对象从Session保存到Global.asax Session_End方法
  5. 中的数据库

    如果您选择B方法,只需序列化/反序列化该对象即可获得它!

    *这些家伙使用SAVESESSION的真正方式是完全不同的