我的应用程序让我在注销后创建,编辑和删除用户。虽然我在用户获得身份验证后很快创建了会话变量,但在注销时也将其删除。但是在mvc4中我无法弄清楚在哪里检查这些会话变量条件(null或不是)。就像在asp.net(c#)中一样,page_load是我们可以实现条件的页面。
在整个互联网上,人们正在讨论用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");
}
答案 0 :(得分: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
{
...
}
答案 1 :(得分:1)
您的问题实际上并不在于检查会话的位置。通常,您可以在操作中的任何位置检查会话值。即使Session.Remove(key)删除了该条目,您仍然可以在集合中找到该键。
我假设您在项目中使用表单身份验证。使用您的注销操作,表单身份验证仍然有效,这就是为什么当您单击浏览器后退按钮时,您仍然可以创建,编辑和删除。您可以更改以下注销操作:
public ActionResult Logout()
{
Session.Clear();
FormsAuthentication.SignOut();
return RedirectToAction("Login", "Account");
}
除了你正在做的事情,我建议实施“return url”,见下面的例子: redirect to return url after login
答案 2 :(得分:-1)
将“Session.abandon”添加到您的退出操作中。