当我注销并单击浏览器后退按钮时,我仍然可以在 MVC4 应用程序中创建、编辑和删除用户
Posted
技术标签:
【中文标题】当我注销并单击浏览器后退按钮时,我仍然可以在 MVC4 应用程序中创建、编辑和删除用户【英文标题】:When I Log-out and click browser back button I still can create,edit and delete users in MVC4 application 【发布时间】:2013-11-13 05:07:42 【问题描述】:我的应用程序允许我在注销后创建、编辑和删除用户。尽管我在用户通过身份验证后不久就创建了会话变量,并且在注销时也将其删除。但是在 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");
【问题讨论】:
【参考方案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
...
【讨论】:
谢谢我已经根据我的需要修改了你的例子,它对我有用public override void OnAuthorization(AuthorizationContext filterContext) if (filterContext == null) throw new ArgumentNullException("filterContext"); if (AuthorizeUser(filterContext)) return; else filterContext.Result = new RedirectToRouteResult (new RouteValueDictionary(new controller = "Session", action = "LogIn" ));
太棒了!如果这回答了您的问题,请将其标记为已回答,以便帮助其他寻找相同类型答案的人。【参考方案2】:
您的问题实际上不在于在哪里检查会话。通常,您可以在操作中的任何位置检查会话值。即使 Session.Remove(key) 删除了该条目,您仍然可以在集合中找到该键。
我假设您在项目中使用表单身份验证。通过您的注销操作,表单身份验证仍然有效,这就是为什么当您单击浏览器后退按钮时,您仍然可以创建、编辑和删除。您可以更改注销操作,如下所示:
public ActionResult Logout()
Session.Clear();
FormsAuthentication.SignOut();
return RedirectToAction("Login", "Account");
除了你正在做的事情之外,我建议实施“返回 url”,请参见下面的示例: redirect to return url after login
【讨论】:
【参考方案3】:将“Session.abandon”添加到您的注销操作中。
【讨论】:
以上是关于当我注销并单击浏览器后退按钮时,我仍然可以在 MVC4 应用程序中创建、编辑和删除用户的主要内容,如果未能解决你的问题,请参考以下文章
通过在 L5 中点击浏览器上的后退按钮来防止注销后再次登录?