7

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

[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 与我重新打开浏览器时的不同。如果我没有选中“记住我”框,那么我将在重新打开浏览器时被迫再次登录

4

5 回答 5

5

我的会话变量也有同样的问题。如果在登录时选择了记住我选项,它将绕过我的代码来设置我下次用户访问该站点时需要的会话变​​量。

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

protected void Session_Start(object sender, EventArgs e)
{
    if (User.Identity.IsAuthenticated)
    {
        Session["Name"] = client.GetName(User.Identity.Name);   
    }
}
于 2013-04-10T15:28:45.080 回答
2

无需将名称添加到会话变量中,只需更改以下内容

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

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

然后,您可以只使用 User.Identity.Name 而不是 @Session["Name"]。

于 2013-05-21T21:45:14.560 回答
0

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

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

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

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

于 2012-04-13T07:05:26.903 回答
0

你遇到的问题是线路

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

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

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

<h3>Welcome, @User.Identity.Name</h3>
于 2012-04-12T12:10:33.580 回答
0
FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe); 

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

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

于 2012-04-12T12:17:21.337 回答