ASP.NET MVC 3 – 处理会话变量

我有一个使用Form的身份validation的应用程序,当用户登录时,我检索用户的实际名称并将其分配给会话变量,如下所示:

[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"); } } } 

然后将其显示在我的索引视图中,如下所示:

 

Welcome, @Session["Name"]

所以,如果我的名字是鲍勃,它会在我的视图中输出“欢迎,鲍勃”,这很好。 但是,一旦我离开页面或关闭我的浏览器并在几分钟后返回,似乎这些Session变量已被销毁,因为它只输出“欢迎”,但我仍然登录,所以我的会话没有被销毁? 我在web.config中将会话设置为在60分钟后被销毁:

  

编辑

这只有在我登录时检查“记住我”框时才会发生,因为我猜这会保留一个cookie客户端,所以当我重新打开浏览器时,我仍然登录但是创建一个新的会话ID,因为我做了一个Response.Write(Session.SessionID)在我关闭浏览器之前,在我的索引页面上Response.Write(Session.SessionID)并且ID与我重新打开它时的ID不同。 如果我没有选中“记住我”框,那么我将在重新打开浏览器后再次登录

我的会话变量遇到了同样的问题。 如果在登录时选择了“记住我”选项,它将绕过我的代码以设置下次用户访问该站点时所需的会话变量。

如果IsAuthenticated为true,我可以通过重新填充会话变量来解决我的问题。

 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 [“Name”]。

你遇到的问题是线路问题

 FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe); 

这是一个cookie,持续时间比会话长(取决于您设置表单超时的时间)

如果您只需要显示用户名,则可以使用并完全删除会话

 

Welcome, @User.Identity.Name

 FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe); 

此代码应该可以正常工作,您应该能够看到"Welcome USERNAME" ,尝试查看IE设置是否像tools-->internet options-->General选项卡delete my browsing history是否已选中。 (在同一个选项卡上,您单击删除按钮,您将看到其清除cookie也可能是问题)。

如果您关闭浏览器而不是会话(inproc)变量,则将保留Cookie值。

也许首先检查以确保不以某种方式启动新会话。 在global.asax.cs文件的Session_Start中放置一个断点:

 protected void Session_Start(object sender, EventArgs e) { var sessionId = Session.SessionID; // break here } 

这可能看起来很愚蠢,但有几件事实际上可能导致新的会话。 消除这些将使您更接近解决方案。

关闭浏览器并再次打开它可能会导致新的会话。 对站点中文件夹结构的更改以及对web.config的更改将导致新会话(应用程序池将被回收)。