1

我的 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);
        }

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

4

3 回答 3

6

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

如果不是这种情况,您还应该在服务器端添加验证,以确保注销的用户(应该像从未登录的用户一样对待)不能做任何需要权限的事情......!

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

在代码隐藏中:

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 清除历史记录,这里是一个示例

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

于 2013-01-26T12:59:54.183 回答
0

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

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

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

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

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

于 2013-01-26T13:02:49.783 回答
0

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

记得把时间检查放在if(!IsPostBack)里面Page_Load()

于 2013-01-26T13:04:35.570 回答