如何防止用户在使用缓存启用的ASP.NET MVC中注销后单击“后退”按钮



我试图防止用户在ASP.NET MVC中注销后所有浏览器中的后退按钮。这是一个已知的问题,但是我发现的所有解决方案都建议我通过在"无缓存"上设置"缓存控制"来禁用缓存。我不想禁用缓存,因为我的系统相对较大,并且需要此缓存。

最终,您无法阻止用户使用后按钮,也不应。您可以尝试,但是有一些方法,并且根据用户的偏好,浏览器可以允许它允许它。无论如何,这是撒尿用户的绝佳方法。

需要讨论两个方面。首先,有特定于浏览器的"缓存"。我在这里使用引号,因为我不是在谈论传统的资源浏览器缓存。例如,Chrome通常会将以前的渲染页面保留在内存中,因此"回到"从技术上发出请求:它只是加载了先前渲染的页面。您将无法做任何事情。如果问题是用户可能能够在上一页上提交表格,或类似的表格,可以通过抗验证令牌解决。

第二,服务器端缓存的用户特定信息存在问题。如果您在身份验证的页面上使用OutputCache,则还应使用VaryByCustom并将有关用户(例如ID)的一些识别信息作为自定义字符串的一部分。然后,当用户注销时,他们将无法获得缓存的副本,因为它将不再属于他们。但是,这实际上更重要的是,要防止已验证的页面在多个登录的用户中共享。如果您正在缓存身份验证的页面而不是用户变化,那么您可能会向错误的用户提供私人信息。

长而简短,解决方案不是要阻止后背按钮,这并不是万无一失的。解决方案是正确设计您的应用程序,以使用户返回。

这不是一个完整的答案,但是我使用此jQuery捕获了后退按钮,并从上一个视图中恢复了分页状态。您可能会使用它来验证授权和重定向。

if (window.history && window.history.pushState) {
    window.history.pushState('forward', null, '');
    $(window).on('popstate', function () {
        window.location.replace("/" + returnURL);
    });
}

最新更新