【问题标题】:.NET Session - Persist session, even when the user closes the browser.NET 会话 - 保持会话,即使用户关闭浏览器
【发布时间】:2012-04-06 10:46:13
【问题描述】:

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

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

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

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

我们希望保留这个会话,即使用户关闭了浏览器。

如何最好地做到这一点?

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

(对不起我的英语.....讲葡萄牙语)

【问题讨论】:

    标签: c# login session-state .net


    【解决方案1】:

    您不应该混淆术语,请记住您在 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" />
    

    【讨论】:

      【解决方案2】:

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

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

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

      基本上你需要

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

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

      *那些家伙使用SAVESESSION的真实方式完全不同

      【讨论】:

        猜你喜欢
        • 2011-02-23
        • 2012-12-28
        • 2011-04-10
        • 1970-01-01
        • 2011-12-17
        • 2012-04-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多