2010-04-21 81 views
26

我正在寻找一种解决方案,用户使用浏览器的后退按钮导航到上一页,一旦退出。ASP.NET身份验证登录和使用浏览器退出按钮

我有一个web应用程序在asp.net中构建,并使用自定义成员资格提供程序进行身份验证和授权。除非用户点击注销链接注销应用程序并重定向到默认封面,否则一切正常,除非用户点击浏览器上的BACK BUTTON,它实际上会回到之前的位置,数据仍然会显示。

当然,他们无法在该页面上做任何事情,点击任何链接,他们将重新导向到登录页面。但是显示这些信息正在让很多用户感到困惑。

我只是想知道是否有任何方法可以清除浏览器的历史记录,以便使用无法返回,或者当他们单击后退按钮并将它们重定向到登录页面时。

谢谢

+1

对于一个好问题+1。好的问题+1仅仅因为糟糕的结论而击败-1。 – 2010-04-21 22:37:06

+0

那是我的懒惰〜会再试一次 – Eatdoku 2010-04-21 23:39:57

回答

21

担心浏览器的历史和后退按钮会给你头痛和生殖器疣。有内置的设施来处理这个问题。

您的注销链接/按钮应指向包含此代码的页面,以及您想要的任何其他内容。

[vb.net]

Imports System.Web.Security 

Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) _ 
Handles MyBase.Load 
    Session.Abandon() 
    FormsAuthentication.SignOut() 
End Sub 

[C#]

using System.Web.Security; 

private void Page_Load(object sender, System.EventArgs e) 
{ 
    // Put user code to initialize the page here 
    Session.Abandon(); 
    FormsAuthentication.SignOut(); 
} 

代码来源于此page并且是有效的,但网页是很难的眼睛。

关于后退行为的一个很好的问题/答案可以找到here

更新:

根据我与马修具有谈话,禁止对敏感或volitile可以用代码来完成个人网页的缓存,例如如下:

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

我好奇地知道它是否适合你,因为它对我有用。

+3

这不是这个问题的答案。 – nima 2011-11-29 13:05:16

+0

这是否也会禁用css/js的缓存?谢谢:D – 2013-01-27 13:30:26

+0

@Sky Sanders - 等等,你不是在下面的答案中告诉某人Response.Cache.SetCacheability(HttpCacheability.NoCache)是他“失去了主意吗?”。无论如何,我仍然喜欢你的回答 – deebs 2016-06-14 20:24:14

3

您可以使用javascript来禁用后退按钮(通常通过将用户发送到转发到另一页的页面,以便点击后再次向前发送)。持久的用户仍然可以在历史中返回两个步骤并跨越循环。

该页面位于浏览器的缓存中。你可以要求浏览器不要缓存任何东西,但这会损坏性能,有时会显着,所以我不会推荐它。

+1

Matthew,为什么在有内置功能来处理问题时提出黑客攻击? – 2010-04-21 22:33:46

+0

Session.Abandon和FormsAuthentication.SignOut不会告诉浏览器清除它的缓存(并且浏览器和它们之间的代理不必遵守no-cache头)缓存的页面仍然可以加载,并且如果请求是在会话结束后从客户端缓存中的页面进行的,不知道结果会是什么,可能是NullReferenceExceptions,因为页面开始检查会话变量(以及重定向到登录页面)。 – MatthewMartin 2010-04-21 23:03:28

+0

然后,no-cache应该在不应复活的敏感页面或易失页面上分散设置。你无法控制客户,只会增加复杂性。如果他们想在注销后返回3次点击进入'页面已过期'..?!?!给他们更多的权力。无论如何,我不是在跟你说只是... p.s.使用@sky来确保我收到评论的回复。 – 2010-04-22 00:10:36

-3

实际上,我找到了一个解决方案,我将下面的代码片段添加到母版页的页面加载方法中。

Page.Response.Cache.SetCacheability(HttpCacheability.NoCache); 

感谢反正答复:)

+7

嘿,转过身来,我想你在某处失去了你的想法... ;-p这就像试图用大锤修理一只手表一样。说得好,这符合DWTF的条件。请重新考虑。 – 2010-04-21 22:32:12

+0

好吧!! ... 让我再试一次:) – Eatdoku 2010-04-21 23:38:10

0

您可以尝试使用的HttpResponse。Cache属性是否会有所帮助:

Response.Cache.SetExpires(DateTime.Now.AddSeconds(60)); 
Response.Cache.SetCacheability(HttpCacheability.Public); 
Response.Cache.SetValidUntilExpires(false); 
Response.Cache.VaryByParams["Category"] = true; 

if (Response.Cache.VaryByParams["Category"]) 
{ 
//… 
} 

或者可能会与HttpResponse.CacheControl完全封锁网页的缓存,但有利于Cache属性之上的它的被弃用:

Response.CacheControl = “No-Cache”; 

或者你可以真的去坚果和手工做这一切:

Response.ClearHeaders(); 
Response.AppendHeader(“Cache-Control”, “no-cache”); //HTTP 1.1 
Response.AppendHeader(“Cache-Control”, “private”); // HTTP 1.1 
Response.AppendHeader(“Cache-Control”, “no-store”); // HTTP 1.1 
Response.AppendHeader(“Cache-Control”, “must-revalidate”); // HTTP 1.1 
Response.AppendHeader(“Cache-Control”, “max-stale=0″); // HTTP 1.1 
Response.AppendHeader(“Cache-Control”, “post-check=0″); // HTTP 1.1 
Response.AppendHeader(“Cache-Control”, “pre-check=0″); // HTTP 1.1 
Response.AppendHeader(“Pragma”, “no-cache”); // HTTP 1.1 
Response.AppendHeader(“Keep-Alive”, “timeout=3, max=993″); // HTTP 1.1 
Response.AppendHeader(“Expires”, “Mon, 26 Jul 1997 05:00:00 GMT”); // HTTP 1.1 

Reference

1

这段代码是非常有用的

Response.Cache.SetCacheability(HttpCacheability.NoCache); 

只有把这个代码的加载事件,在情况下,主PAGEN,但它仅适用于IE浏览器,IE浏览器和Firefox我用

Response.Cache.SetCacheability(HttpCacheability.NoCache); 
Response.Cache.SetNoStore(); 
1

Your Answer

的解决方法,这是添加JavaScript代码的logout.aspx页面的部分如下:

<script type="text/javascript"> 
window.history.forward(1); 
</script> 

如果用户通过按下后退按钮进入注销页面,此JavaScript代码将转发用户。

如果您需要确保用户有没有办法让回到页面他们注销你必须问的浏览器不包括类似在每一页上下面的代码缓存任何页面后:

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