如何退出会话MVC Razor visual studio



我正试图从MVC Razor的会话中注销,这是我目前在MainController中的内容:

[HttpPost]
public ActionResult Login(Users user)
{
    if (ModelState.IsValid)
    {
        if (ValidateUser(user.Email, user.Password))
        {
            FormsAuthentication.SetAuthCookie(user.Email, false);
            return RedirectToAction("Index", "Members");
        }
        else
        {
            ModelState.AddModelError("", "");
        }
    }
    return View();
}
private bool ValidateUser(string Email, string Password)
{
    bool isValid = false;
    using (var db = new ShareRideDBEntities())
    {
        var User = db.tblProfiles.FirstOrDefault(u => u.PROF_Email == Email);
        var ut = db.tblProfilesTypes.FirstOrDefault(t => t.TPE_ID == User.PROF_UserType);
        if (User != null)
        {
            if (User.PROF_Password == Password)
            {
                Session["UserID"] = User.PROF_UserID;
                Session["Name"] = User.PROF_FirstName;
                Session["Email"] = User.PROF_Email;
                Session["FullName"] = User.PROF_FirstName + " " + User.PROF_LastName;
                isValid = true;
            }
        }
    }
    return isValid;
}

这样我可以登录用户并将其重定向到他的UserCP或用户控制面板。

如果用户没有登录,他们将无法使用我的MembersController中的这段代码访问成员区域:

public ActionResult UserCP()
{
    if (Session["UserID"] == null)
    {
        return RedirectToAction("Index", "Main");
    }
    else
    {
        return View();
    }
}
public ActionResult LogOut()
{
    FormsAuthentication.SignOut();
    return RedirectToAction("index", "main");
}

它会重定向用户回到主索引页,如果他/她还没有登录,但当我测试退出按钮,它重定向我正常,但我仍然能够回到用户控制面板,这是我不希望它发生。

当然我加了

using System.Web.Security;

使用FormAuthentication.SignOut();

如果有人能解释一下,请提前感谢。

FormsAuthentication.SignOut();之后,您需要调用Session.Abandon(),这将清除当前会话并在下一次请求时重新创建新会话

public ActionResult LogOut()
{
    FormsAuthentication.SignOut();
    Session.Abandon(); // it will clear the session at the end of request
    return RedirectToAction("index", "main");
}

Session.ClearSession.RemoveAll相同;后者只是打电话给前者。它们立即删除会话中存储的所有项,但会话本身保留下来。Session_OnEnd不开火

Session.Abandon实际上并没有立即清除这些值,它只是在当前请求结束时标记会话被放弃。您可以继续读取请求其余部分的值。如果您稍后在请求中写入会话,则新值将在请求结束时安静地丢弃,没有任何警告。Session_OnEnd在请求结束时触发,而不是在调用Abandon时触发。你可以这样使用。

public ActionResult LogOut()
{
    FormsAuthentication.SignOut();
    Session.Clear();
    Session.RemoveAll();
    Session.Abandon(); 
    return RedirectToAction("index", "main");
}

最新更新