我正在 MVC3 中开发一个应用程序,其中有一个登录页面。用户登录页面后,当他/她单击浏览器的后退按钮时,问题就出现了,它会将他们带回到我不想要的登录页面。
长话短说,我希望登录功能与 facebook、gmail 和其他类似网站的功能完全相同。
我想到的一种方法是在登录后找到一种控制浏览器后退按钮的方法,因此如果单击它,则将用户重定向到相同的登录页面。我做了很多研究,但似乎没有什么对我有用。
任何将不胜感激。提前致谢。
我正在 MVC3 中开发一个应用程序,其中有一个登录页面。用户登录页面后,当他/她单击浏览器的后退按钮时,问题就出现了,它会将他们带回到我不想要的登录页面。
长话短说,我希望登录功能与 facebook、gmail 和其他类似网站的功能完全相同。
我想到的一种方法是在登录后找到一种控制浏览器后退按钮的方法,因此如果单击它,则将用户重定向到相同的登录页面。我做了很多研究,但似乎没有什么对我有用。
任何将不胜感激。提前致谢。
尽管 Darin 提供的解决方案会起作用。但如果你问我,Facebook 还没有实施该解决方案。我相信一个适当的解决方案应该不会很难实施。我们需要做两件事。
确保经过身份验证的用户无法访问登录页面。
可以修改登录get方法如下
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public ActionResult Login(LoginModel model, string returnUrl)
{
//Important
if (Request.IsAuthenticated)
{
return RedirectToAction("Action", "Controller"); // ur action and controller
}
if (ModelState.IsValid && WebSecurity.Login(model.UserName, model.Password, persistCookie: model.RememberMe))
{
return RedirectToLocal(returnUrl);
}
// If we got this far, something failed, redisplay form
ModelState.AddModelError("", "The user name or password provided is incorrect.");
return View(model);
}
确保登录页面未缓存
将此代码放入上述方法中以确保永远不会从缓存中返回逻辑页面
Response.Cache.SetExpires(DateTime.UtcNow.AddDays(-1));
Response.Cache.SetValidUntilExpires(false);
Response.Cache.SetRevalidation(HttpCacheRevalidation.AllCaches);
Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.Cache.SetNoStore();
或者,您可以NoCache
在 Login 方法上使用 ActionFilter。它会做和上面一样的事情。
您可以将以下脚本放在登录视图中(包含用户名和密码字段的脚本):
<script type="text/javascript">
window.history.forward();
</script>
如果你的登录 httpget 动作有一个 NoCache 动作过滤器来防止浏览器缓存它,那么如果用户通过后退按钮返回它,浏览器将请求一个新的登录页面并且控制器动作代码可以检测到用户已经经过身份验证并将它们重定向到不同的页面。