我有一个使用Form的身份验证的应用程序,当用户登录时,我检索用户的实际名称并将其分配给会话变量,如下所示:
[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>
因此,如果我的名字是Bob,它会在我的视图中输出“Welcome,Bob”,这样可以正常工作。但是,一旦我离开页面或关闭我的浏览器并在几分钟后返回,似乎这些Session变量已被销毁,因为它只是输出“欢迎”,但我仍然登录,所以我的会话没有被销毁?我在web.config中将会话设置为在60分钟后销毁:
<sessionState regenerateExpiredSessionId="true" timeout="60" />
只有当我在登录时检查“记住我”框时才会发生这种情况,因为我猜这会保留一个cookie客户端,因此当我重新打开浏览器时我仍然登录但是创建了一个新的会话ID,就像我做的那样我的索引页面上的Response.Write(Session.SessionID)
和我关闭浏览器之前的ID与我重新打开它时的ID不同。如果我没有选中“记住我”框,那么我将在重新打开浏览器时被迫再次登录
答案 0 :(得分:5)
我的会话变量遇到了同样的问题。如果在登录时选择了“记住我”选项,它将绕过我的代码以设置下次用户访问该站点时所需的会话变量。
如果IsAuthenticated为true,我可以通过重新填充会话变量来解决我的问题。
protected void Session_Start(object sender, EventArgs e)
{
if (User.Identity.IsAuthenticated)
{
Session["Name"] = client.GetName(User.Identity.Name);
}
}
答案 1 :(得分:2)
不要将名称添加到会话变量,只需更改以下内容
即可FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
到
FormsAuthentication.SetAuthCookie(client.GetName(model.UserName), model.RememberMe);
然后您可以使用User.Identity.Name而不是@Session [“Name”]。
答案 2 :(得分:0)
您遇到的问题是
行FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
这是一个cookie,持续时间比会话长(取决于您设置表单超时的时间)
如果您只需显示用户名,则可以使用并完全删除会话
<h3>Welcome, @User.Identity.Name</h3>
答案 3 :(得分:0)
FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
此代码应该可以正常工作,您应该能够看到"Welcome USERNAME"
,尝试查看是否检查了tools-->internet options-->General
标签delete my browsing history
等IE设置。 (在同一个选项卡上,您单击删除按钮,您将看到其清除cookie也可能会出现问题)。
如果您关闭浏览器但不关闭会话(inproc)变量,将保留Cookie值。
答案 4 :(得分:0)
也许首先检查以确保不会以某种方式启动新会话。在Session_Start
文件的global.asax.cs
中放置一个断点:
protected void Session_Start(object sender, EventArgs e)
{
var sessionId = Session.SessionID; // break here
}
这可能看起来很愚蠢,但有几件事实际上可能导致新的会话。消除这些将使您更接近解决方案。
关闭浏览器并再次打开它可能会导致新的会话。对站点中文件夹结构的更改以及对web.config的更改将导致新会话(应用程序池将被回收)。