自定义ActionFilter用于禁用BACK按钮

时间:2011-12-01 16:38:26

标签: asp.net-mvc

目前正在使用{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>

由于

2 个答案:

答案 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属性

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

由于