2

我使用以下代码跨页面检索登录用户身份

// login method of account model
public ActionResult Login(LoginModel model)
{
    Session["username"]=model.Username;
    //redirect to login controler
}

并在登录控制器中

public ActionResult LoginLayout()
{
    if(IsAdmin(Session["username"]))
        return View();
    else
        return OtherView();
}

一切都很好,直到我关闭浏览器然后重新打开它,然后我总是被重定向到,OtherView()即使我仍然被认证为登录用户。

更新

    [HttpPost]
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    public ActionResult Login(LoginModel model, string returnUrl)
    {
        if (ModelState.IsValid && WebSecurity.Login(model.UserName, model.Password, persistCookie: model.RememberMe))
        {                
            Session["username"] = model.UserName;
            return RedirectToLocal(returnUrl);
        }

        // If we got this far, something failed, redisplay form
        ModelState.AddModelError("", "The user name or password provided is incorrect.");
        return View(model);
    }
4

3 回答 3

2

您必须始终准备好清除会话状态。例如,如果更改了 web.config 文件,工作进程将被回收,所有进程内会话状态都将丢失。您可以通过使用进程外会话状态来缓解这种情况,但作为最佳实践,您应该随时准备丢失会话。

于 2013-02-22T02:07:47.730 回答
1

您只需要检查您是否已登录,因为您的 cookie 是持久的。它与会话无关,因为关闭浏览器后会话将永远不存在,除非您将会话存储在数据库或状态中

于 2013-02-22T01:57:52.447 回答
0

由于先前的回复状态,您无法在浏览器关闭后回复会话状态仍然有效。以下两篇文章应该会有所帮助

ASP.NET 会话状态概述

ASP.NET 状态管理建议

蒂姆

于 2013-02-23T13:12:31.677 回答