【问题标题】:How to prevent logged out user from revisiting previous page using back button in asp .net?如何防止注销的用户使用asp .net中的后退按钮重新访问上一页?
【发布时间】:2013-01-10 07:39:01
【问题描述】:

我的 asp .net 应用程序面临注销用户使用浏览器的后退按钮重新访问以前访问的页面的问题。用户无法执行任何服务器端事件,但如果根本不允许用户查看此页面会更好。我搜索了一种解决方案来阻止这种情况,但大多数解决方案都包括在页面内编写代码,不能像这样重新访问。

 protected override void OnPreRender(EventArgs e)
        {
            base.OnPreRender(e);
            string sb;
            sb = "<script language=javascript>\n";
            sb += "window.history.forward(1);\n";
            sb += "\n</script>";
            ClientScript.RegisterClientScriptBlock(Page.GetType(), "clientScript", sb);
        }

这意味着我必须在登录用户可以访问的每个页面中编写代码。 有没有更好的方法来处理这个问题?我期待一个优化的解决方案,我将不必在每一页中编写代码。帮助将不胜感激。

【问题讨论】:

  • 根据您的 cmets 更新了我的答案

标签: c# asp.net back-button browser-history


【解决方案1】:

根据您的问题,我了解您只想阻止使用“后退”按钮(查看以前的数据),但 您的服务器端工作正常并且不允许注销的用户执行任何任务...

如果情况不是,您还应该在服务器端添加验证,以确保已注销的用户(应该像从未登录的用户一样对待)无法执行任何需要权限的东西...!

回到您的问题 - 您应该在浏览器中禁用缓存。

在代码隐藏中:

Response.Cache.SetNoStore();
Response.Cache.SetExpires(DateTime.UtcNow.AddHours(-1));
Response.Cache.SetCacheability(HttpCacheability.NoCache);

您还可以在 ASPX 页面中使用 META 标签:

 <META Http-Equiv="Pragma" Content="no-cache">
 <META Http-Equiv="Expires" Content="0">
 <META Http-Equiv="Cache-Control" Content="no-cache">

这会告诉浏览器页面不应该被缓存并且不会通过Back按钮重新显示

如果这还不够,你还可以使用 JavaScript 清除历史记录,here is an example

编辑: 如果您希望此代码只出现一次,您可以创建一个具有此逻辑的BasePage(派生自Page)。然后,您想要此逻辑的任何页面都应从BasePage 派生,而不是常规的System.Web.UI.Page

【讨论】:

    【解决方案2】:

    假设每个受限制的页面都检查用户是否有权访问该页面,那么您遇到的问题归结为缓存。如果您不检查用户是否已登录,则无法绕过它 - 您必须检查每个页面以确保安全。否则就是一个安全漏洞。

    这样想。用户访问的页面已保存到他们的计算机中,以便可以将其呈现给用户。用户随后登出。作为浏览器缓存的一部分,上一页仍然存在于他们的计算机上。

    在这种情况下,用户能够再次查看该页面并没有什么特别的问题。如果你想保护这个页面,你已经请求浏览器不要缓存这个页面。

    您可以使用元标记来实现这一点。 .NET 可能有其他方法来完成这项工作。

    请记住,这意味着每个设置为不缓存的页面每次都会返回到服务器,并且会发现速度较慢。它还会给 Web 服务器带来额外的负载。根据您网站的繁忙程度,这可能不是问题。

    【讨论】:

      【解决方案3】:

      使用@Blachshma 提到的解决方案,您还可以拥有一个包含获取页面时间的时间戳的 GET 变量。然后,在Page_Load() 事件中,您可以检查时间戳是否与当前时间戳相同。如果不是,则刷新或重定向页面(在您的情况下为登录页面)这就是 GMAIL 的方式 IIRC。

      记得将时间检查放在if(!IsPostBack)Page_Load() 事件中。

      【讨论】:

      • Ankit ,此解决方案需要将提供的代码放置在用户可能访问的每个页面中。使用我给出的示例,我可以达到相同的结果。我正在寻找需要最少更改的解决方案。
      • 无论如何你都必须放置这样的代码,因为只有当用户登录@MridulRaj 时,你才授予用户查看页面的权限
      • 有趣 - 如果用户确实“正确地”重新访问页面 - 意思是 没有 退出 - 例如,如果我有一个 ASP.Net 向导并且可以来回切换通过Steps?
      • 他必须检查用户是否已注销,或者重新显示@EdSF
      猜你喜欢
      • 2016-02-06
      • 2015-03-12
      • 2013-04-05
      • 1970-01-01
      • 2011-08-13
      • 1970-01-01
      • 1970-01-01
      • 2010-10-31
      • 2015-09-28
      相关资源
      最近更新 更多