ASP.NET MVC 3 - 用Session变量处理(ASP.NET MVC 3 - Deal

2019-09-16 12:25发布

我有一个使用窗体的身份验证的应用程序,当用户登录的中,我检索用户的真实姓名,并分配到一个会话变量,就像这样:

[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是不同的一个,当我重新打开了它。 如果我不检查我的“记住我”框,然后我不得不在重新打开浏览器再次登录

Answer 1:

我有同样的问题,我的会话变量。 如果还记得我的选择是在登录时选择它会绕过我的代码来设置,我需要在用户下一次会去现场会话变量。

我能够重新填充会话变量如果IsAuthenticated是真的要解决我的问题。

protected void Session_Start(object sender, EventArgs e)
{
    if (User.Identity.IsAuthenticated)
    {
        Session["Name"] = client.GetName(User.Identity.Name);   
    }
}


Answer 2:

而不是添加名称会话变量,只是改变以下

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

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

然后,您可以只使用User.Identity.Name代替@Session [“名称”]。



Answer 3:

你的问题是与线

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

这是一个cookie,比会话持续时间更长(这取决于你多久设置形式超时)

如果你需要的是只显示用户名,您可以使用,只是完全消除会议

<h3>Welcome, @User.Identity.Name</h3>


Answer 4:

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

此代码应工作正常,你应该能够看到"Welcome USERNAME" ,试图看到,无论是IE的设置,如tools-->internet options-->General选项卡中delete my browsing history被选中与否。 (在同一个标​​签是你删除按钮点击,你会看到它的清除cookie也是如此,可能是问题)。

饼干值将被保留,如果你关闭浏览器而不是会话(进程内)变量。



Answer 5:

也许第一次检查,以确保新的会话不以某种方式启动。 放置在一个断点Session_Startglobal.asax.cs文件:

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

这似乎愚蠢,但也有几件事情,可能实际上会导致一个新的会话。 消除这些都会让你更接近的解决方案。

关闭浏览器,然后再次打开它可能会导致一个新的会话。 修改您的网站,并转移到web.config文件中的文件夹结构会导致一个新的会话(应用程序池将被回收)。



文章来源: ASP.NET MVC 3 - Dealing with Session variables