首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当我注销并单击“浏览器后退”按钮时,我仍然可以在MVC4应用程序中创建、编辑和删除用户。

当我注销并单击“浏览器后退”按钮时,我仍然可以在MVC4应用程序中创建、编辑和删除用户。
EN

Stack Overflow用户
提问于 2013-11-01 22:12:54
回答 3查看 3K关注 0票数 3

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

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

有人能帮我找到正确的位置检查会话变量null或not的条件吗?是观景吗?这是share_layout视图吗?或者是控制器?或者其他我没有提示的东西请帮帮忙。

这是我的会话控制器代码

代码语言:javascript
复制
[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();
        }

和登出

代码语言:javascript
复制
 public ActionResult Logout()
    {
        Session.Remove("UserId");
        Session.Remove("UserName");
        Session.Remove("RoleName");
        return RedirectToAction("LogIn", "Session");

    }
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-11-01 22:32:47

从理论上讲,您希望使用FormAuthentication。它适用于默认的开箱即用AuthorizeAttribute

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

这里的例子-

代码语言:javascript
复制
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);
    }    
}

用法

代码语言:javascript
复制
[MyAuthorizeAttribute]
public class MyController : Controller
{
   ...
}
票数 1
EN

Stack Overflow用户

发布于 2013-11-02 01:54:25

您的问题不在于检查会话的位置。通常,您可以在操作的任何地方检查会话值。即使Session.Remove(键)删除了条目,仍然可以在集合中找到键。

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

代码语言:javascript
复制
public ActionResult Logout()
    {
        Session.Clear();
        FormsAuthentication.SignOut();
        return RedirectToAction("Login", "Account");
    }

除了您正在做的事情之外,我建议实现“返回url",参见下面的示例:重定向以在登录后返回url

票数 1
EN

Stack Overflow用户

发布于 2013-11-01 22:21:06

在注销操作中添加“Session.abandon”。

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19736246

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档