我有一个使用窗体的身份验证的应用程序,当用户登录的中,我检索用户的真实姓名,并分配到一个会话变量,就像这样:
[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>
所以,如果我的名字是鲍勃,它会输出“欢迎,鲍勃”在我看来,这工作得很好。 但是,一旦我从页面进行浏览,或关闭浏览器,稍后再回来了几分钟,就好像这些Session变量已被销毁,因为它只是输出“欢迎”,但我仍然登录,所以我的心不是会破坏? 我设置在我的web.config 60分钟后要销毁的会议:
<sessionState regenerateExpiredSessionId="true" timeout="60" />
编辑
这只有当我检查我的“记住我”框登录时,我想这保持一个cookie的客户端,所以当我重新打开我的浏览器我还在登录,但我做了一个创建一个新的会话ID发生Response.Write(Session.SessionID)
我的索引页上和之前我闭上了浏览器的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也是如此,可能是问题)。
饼干值将被保留,如果你关闭浏览器而不是会话(进程内)变量。
也许第一次检查,以确保新的会话不以某种方式启动。 放置在一个断点Session_Start
中global.asax.cs
文件:
protected void Session_Start(object sender, EventArgs e)
{
var sessionId = Session.SessionID; // break here
}
这似乎愚蠢,但也有几件事情,可能实际上会导致一个新的会话。 消除这些都会让你更接近的解决方案。
关闭浏览器,然后再次打开它可能会导致一个新的会话。 修改您的网站,并转移到web.config文件中的文件夹结构会导致一个新的会话(应用程序池将被回收)。