3

我的应用程序允许我在注销后创建、编辑和删除用户。尽管我在用户通过身份验证后不久就创建了会话变量,并且在注销时也将其删除。但是在 mvc4 中,我无法弄清楚在哪里检查这些会话变量条件(是否为 null)。就像在 asp.net(c#)page_load 中我们可以实现 if 条件的页面一样。

在整个互联网上,人们都在讨论使用 java 脚本禁用浏览器后退按钮以及删除 cookie,但在我的情况下,一旦用户注销,如果他使用浏览器后退按钮查看内容,如果单击它应该重定向到登录页面。

有人可以帮助我找到正确的位置来检查会话变量是否为 null 的条件。是视图吗?是 share_layout 视图吗?或者它是控制器?或者其他我没有提示的东西,请帮忙。

这是我的会话控制器代码

[HttpPost]
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    public ActionResult LogIn(User user)
    {
        try
        {
            if (ModelState.IsValid)
            {
                var userdb = db.User.Include("Role").Single(c => c.userName == user.userName);
                if (userdb.passWord == user.passWord)
                {
                    Session["UserId"] = userdb.userId;
                    Session["UserName"] = userdb.userName;
                    Session["RoleName"] = userdb.Role.roleName;


                    if (userdb.Role.roleName == "Employee")
                    {
                        return RedirectToAction("Index", "Employee");
                    }
                    else if (userdb.Role.roleName == "Customer")
                    {
                        return RedirectToAction("Index", "CustomerSite");
                    }
                    else if (userdb.Role.roleName == "Admin")
                    {
                        return RedirectToAction("Index", "Admin");
                    }
                }
 else
                {
                    ViewBag.errorMsg = "We cannot authenticate you please use the right username or password";
                    return View();
                }
            }
            return View();
        }

对于注销

 public ActionResult Logout()
    {
        Session.Remove("UserId");
        Session.Remove("UserName");
        Session.Remove("RoleName");
        return RedirectToAction("LogIn", "Session");

    }
4

3 回答 3

1

理论上你想使用FormAuthentication。它适用于开箱即用的默认AuthorizeAttribute 。

如果要实现自己的逻辑,可以重写 AuthorizeAttribute。

这里的例子 -

public class MyAuthorizeAttribute : AuthorizeAttribute
{
    private bool AuthorizeUser(AuthorizationContext filterContext)
    {
        bool isAuthorized = false;

        if (filterContext.RequestContext.HttpContext != null)
        {
            var context = filterContext.RequestContext.HttpContext;

            if(context.Session["UserId"] != null)
                 isAuthorized = true;
        }
        return isAuthorized;
    }

    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        if (filterContext == null)
            throw new ArgumentNullException("filterContext");

        if (AuthorizeUser(filterContext))
                return;       

        base.OnAuthorization(filterContext);
    }    
}

用法

[MyAuthorizeAttribute]
public class MyController : Controller
{
   ...
}
于 2013-11-01T22:32:47.267 回答
1

您的问题实际上与在哪里检查会话无关。通常,您可以在操作中的任何位置检查会话值。即使 Session.Remove(key) 删除了该条目,您仍然可以在集合中找到该键。

我假设您在项目中使用表单身份验证。通过您的注销操作,表单身份验证仍然有效,这就是为什么当您单击浏览器后退按钮时,您仍然可以创建、编辑和删除。您可以更改注销操作,如下所示:

public ActionResult Logout()
    {
        Session.Clear();
        FormsAuthentication.SignOut();
        return RedirectToAction("Login", "Account");
    }

除了你在做什么,我建议实施“返回网址”,见下面的例子: 登录后重定向到返回网址

于 2013-11-02T01:54:25.487 回答
-2

将“Session.abandon”添加到您的注销操作中。

于 2013-11-01T22:21:06.693 回答