目前正在使用{MVC 3.0 3.0应用程序并使用FormsAuthentication
。
当用户点击Logoff链接时,它会调用以下内容:
public ActionResult LogOff()
{
FormsAuthentication.SignOut();
return RedirectToAction("Index", "Home");
}
效果很好!
但是如果用户单击BACK按钮,他会看到他的上一页(虽然他设置[Authorize]
属性后他将无法执行任何操作)并且我们不希望这样。 / p>
经过多次关于此主题的搜索和帖子后,我最终创建了一个名为[NoCache]
的自定义ActionFilter,它位于我拥有的每个[Authorize]
属性的正下方。
[NoCache]
属性如下所示:
public class NoCacheAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
HttpContext.Current.Response.Cache.SetExpires(DateTime.UtcNow.AddDays(-1));
HttpContext.Current.Response.Cache.SetValidUntilExpires(false);
HttpContext.Current.Response.Cache.SetRevalidation(HttpCacheRevalidation.AllCaches);
HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.NoCache);
HttpContext.Current.Response.Cache.SetNoStore();
}
}
它似乎有效,但我很想知道这是否适合使用(或不使用)。使用这种技术时是否有任何我不知道的已知问题?
此外,我被告知如果我有SSL证书,那么我不需要这样做,而是创建并设置一个带有Cache-Control: no-cache
的HTTP标头,最终会使所有我的https页面未缓存。
任何人都可以证实吗? 如果以上是真的,那么我为什么要创建自定义ActionFilter?
随意分享任何想法或更好的方法......
请记住,最终目标是确保用户在签名后单击“返回”按钮时看不到他的上一页( 由于FormsAuthentication.SignOut();
)< / p>
答案 0 :(得分:1)
使用RedirectToActionPermanent(“索引”,“主页”)会为您工作吗?我认为它会阻止他们返回前一页(可能不是全部)。
Scott Hanselman建议在提出类似问题Post/Redirect/Get PRG Model时将应用程序设计更改为here。
更新: 第三种选择是为每个页面生成唯一令牌,并在每次请求时使先前令牌无效。 Here is an answer提到了一个类似的问题,甚至提到使用该方法的银行。
答案 1 :(得分:1)
结论:
我决定以下面的结论结束这篇文章......
Shawn提供的PRG模型建议(和链接)很棒,实际上应该在开发MVC应用程序时实践。
该模式确保点击刷新(F5)的用户不会再次重新提交表单/数据。所以这是在提交表单后进行适当重定向的问题。
至于我的问题,我想向尝试尝试的用户显示登录页面,然后只在 他们已经注销后(在FormsAuthentication.SignOut之后)点击后退按钮。
我正在寻找的行为与您注销银行网站时的行为相同。你可以随意点击后退按钮,但是它们会显示一条消息,告诉你你的会话已经过期(反过来,你又被迫再次登录。)
我还没有找到(或继续)解决方案,但自定义NoCache属性似乎是要走的路。
一旦投入生产,我将获得一个SSL证书应用于受保护的页面,当我们到达那里时,我可能会找到一种不同的方式来实现我的任务没有使用NoCache属性
如果我这样做,我会分享我的发现。
由于