我有一个使用[授权]保护私有位的MVC应用程序。当我选择SignOut()URL时,它会告诉我,但是如果我点击浏览器上的后退按钮,它会转到安全页面,甚至让我使用该表单。行动发生,然后它显示我已退出。问题是它执行安全操作(在我的数据库中插入一行)。然后我可以再次使用后退按钮并全部完成。如果我在注销后使用后退按钮并点击浏览器刷新它确实显示我已注销并拒绝访问安全页面。
我错过了重要的事情吗?这似乎是一个非常大的安全问题。
public ActionResult LogOff(string ReturnUrl)
{
FormsAuth.SignOut();
if (!String.IsNullOrEmpty(ReturnUrl))
{
return Redirect(ReturnUrl);
}
else
{
return RedirectToAction("Index", "Page");
}
}
答案 0 :(得分:5)
我认为问题在于浏览器缓存页面。这就是为什么单击后退按钮后它不会重新加载页面的原因。如果在标题中指定不应缓存页面,则应在按下后退按钮后重新加载页面。然后用户被拒绝。
然而,在某些情况下,让它工作可能会很棘手。 有关详细信息,请参阅此Caching Tutorial。
答案 1 :(得分:3)
清除会话可能有所帮助。这是我的退出方法:
public ActionResult Signout()
{
Session.Clear();
FormsAuthentication.SignOut();
return RedirectToAction("Index", "Home");
}
答案 2 :(得分:1)
您使用的是会话信息吗? FormsAuth.SignOut()仅影响页面的新实例。当你回去时,你被授权在那里(以前)。除非您有代码检查请求的cookie /会话/真实性,否则允许PostBack。它甚至绕过了global.asax,因为已经生成了ViewState。
您可能希望在基类中添加会话查杀语句或提供一些额外的身份验证检查,以确保用户真正被授权在他们所在的位置,无论他们是什么时候。
或者,您可以关闭页面缓存,这应该使后退按钮相当无用(它将提供页面过期默认值)。这将为依赖后退按钮的用户带来怪异,但它有助于保证页面的安全性,因为它会强制首先“重新渲染”页面。