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

本文关键字:会话 浏览器 用户 NET | 更新日期: 2023-09-27 18:28:39

我们使用.net框架3.5和C#。

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

然后我们调用FormsAuthentication.SetAuthCookie(),这样用户我们´´就会登录到我的应用程序中。

在随后的所有页面上,我们使用User.Identity.IsAuthenticated()检查用户是否已登录。

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

最好的方法是什么?

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

(对不起我的英语……说葡萄牙语的人)

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

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

我建议使用更干净的方法来存储会话信息。当然,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的真实方式与截然不同