Asp.net mvc 用于禁用“后退”按钮的自定义ActionFilter

Asp.net mvc 用于禁用“后退”按钮的自定义ActionFilter,asp.net-mvc,Asp.net Mvc,目前正在使用ASP.NET MVC 3.0应用程序并使用表单身份验证 当用户单击注销链接时,将调用以下命令: public ActionResult LogOff() { FormsAuthentication.SignOut(); return RedirectToAction("Index", "Home"); } 很好 但是,如果用户单击“后退”按钮,他将看到上一页(尽管由于设置了[Authorize]属性,他将无法执行任何操作),我们不希望这样 在对这个主题进行了多次搜

目前正在使用ASP.NET MVC 3.0应用程序并使用
表单身份验证

当用户单击注销链接时,将调用以下命令:

public ActionResult LogOff()
{
    FormsAuthentication.SignOut();
    return RedirectToAction("Index", "Home");
}
很好

但是,如果用户单击“后退”按钮,他将看到上一页(尽管由于设置了
[Authorize]
属性,他将无法执行任何操作),我们不希望这样

在对这个主题进行了多次搜索和发布之后,我最终创建了一个名为
[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();


谢谢

使用RedirectToActionPermanent(“索引”、“主页”)对您有用吗?我认为这会阻止他们回到上一页(也许不是全部)

Scott Hanselman建议在遇到类似问题时将应用程序设计更改为

更新: 第三个选项是为每个页面生成唯一的令牌,并在每次请求时使以前的令牌无效。对于一个类似的问题,甚至提到一家银行使用这种方法。

结论:

我决定以以下结论结束这篇文章

Shawn提供的PRG模型建议(和链接)非常好,确实应该在开发MVC应用程序时加以实践

该模式确保点击刷新(F5)的用户不会再次重新提交表单/数据。因此,这是一个在表单提交后进行适当重定向的问题

至于我的问题,我想在用户注销后(在FormsAuthentication.SignOut之后),向那些尝试并点击后退按钮的用户显示登录页面

我正在寻找的行为与您注销银行网站时的行为相同。您可以自由点击后退按钮,但他们会显示一条消息,让您知道您的会话已过期(反过来,您将被迫再次登录)

我还没有找到(或致力于)一个解决方案,但定制NoCache属性似乎是一条出路

一旦投入生产,我将有一个SSL证书应用于受保护的页面,也许,当我们到达那里时,我可能会找到一种不同的方法来完成我的任务,而不使用NoCache属性

如果我这样做,我会分享我的发现


谢谢

谢谢Shawn,我没有读过太多关于PRG型号的书(我也会读),但它似乎更适合后退按钮,这很好,但不确定它是否适合我正在尝试的功能。也许我错了,但我担心的是,我不会对你友好,我只希望你的行为与你离开/注销银行网站并尝试“后退”按钮时的行为相同。它几乎显示了一个页面,解释您的会话已结束,并显示一个链接,将您带回登录页面。也许是我对PRG模型缺乏了解,这让我想知道它是否能帮助我达到我想要的结果。文斯,你找到了更有效的解决方案吗?