ASP.NET MVC 3 - 处理会话变量
本文关键字:处理 会话 变量 NET MVC ASP | 更新日期: 2023-09-27 18:31:04
我有一个使用表单身份验证的应用程序,当用户登录时,我检索用户的实际名称并将其分配给会话变量,如下所示:
[HttpPost]
public ActionResult LogOn(LogOnModel model, string returnUrl)
{
if (ModelState.IsValid)
{
if (Membership.ValidateUser(model.UserName, model.Password))
{
Session["Name"] = client.GetName(model.UserName);
FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
return RedirectToAction("Index", "Home");
}
}
}
然后,这将显示在我的索引视图中,如下所示:
<h3>Welcome, @Session["Name"]</h3>
因此,如果我的名字是鲍勃,它将在我的视图上输出"欢迎,鲍勃",这工作正常。但是一旦我离开页面或关闭浏览器并在几分钟后返回,似乎这些会话变量已被销毁,因为它只输出"欢迎",但我仍然登录,所以我的会话没有被销毁?我已经在我的 web.config 中将会话设置为在 60 分钟后销毁:
<sessionState regenerateExpiredSessionId="true" timeout="60" />
编辑
这仅在我在登录时选中"记住我"框时发生,因为我想这会保留 cookie 客户端,因此当我重新打开浏览器时,我仍然登录,但当我在我的索引页面上进行Response.Write(Session.SessionID)
时,会创建一个新的会话 ID,并且关闭浏览器之前的 ID 与我重新打开时的 ID 不同。如果我不选中"记住我"框,那么我在重新打开浏览器时被迫再次登录
我的会话变量也有同样的问题。如果在登录时选择了"记住我"选项,它将绕过我的代码来设置用户下次访问该站点时所需的会话变量。
如果 IsAuthenticated 为真,我能够通过重新填充会话变量来解决我的问题。
protected void Session_Start(object sender, EventArgs e)
{
if (User.Identity.IsAuthenticated)
{
Session["Name"] = client.GetName(User.Identity.Name);
}
}
名称添加到会话变量中,只需更改以下内容
FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
自
FormsAuthentication.SetAuthCookie(client.GetName(model.UserName), model.RememberMe);
然后,您可以只使用 User.Identity.Name 而不是@Session["名称"]。
您遇到的问题与行有关
FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
这是一个 cookie,持续时间比会话更长(取决于您设置表单超时的时间)
如果您只需要显示用户名,则可以使用并完全删除会话
<h3>Welcome, @User.Identity.Name</h3>
FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
这段代码应该可以正常工作,你应该能够看到"Welcome USERNAME"
,尝试查看IE设置(如tools-->internet options-->General
选项卡delete my browsing history
)是否被选中。 (在同一选项卡上,您单击删除按钮,您将看到其清除cookie,因此可能存在问题)。
如果您关闭浏览器但不关闭会话(非进程)变量,则 Cookie 值将被保留。
也许首先检查以确保新会话不会以某种方式启动。 在global.asax.cs
文件的Session_Start
中放置断点:
protected void Session_Start(object sender, EventArgs e)
{
var sessionId = Session.SessionID; // break here
}
这可能看起来很愚蠢,但有几件事实际上可能会导致新的会话。 消除这些将使您更接近解决方案。
关闭浏览器并再次打开可能会导致新会话。 对站点内文件夹结构的更改以及对 web.config 的更改将导致新会话(将回收应用程序池)。