注销后阻止页面检查

时间:2012-04-01 16:07:26

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

这是Google的一个非常着名的问题。我找到了几个实现此功能的建议。我实施的程序如下所述:

我在主页中添加了一个Logout Link,点击该链接后我将用户重定向到了注销页面。

protected void LinkButton1_Click(object sender, EventArgs e) {      
    Response.Redirect("../Logout.aspx");
}

现在在Logout.aspx中我添加了:

Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.Cache.SetExpires(DateTime.Now.AddSeconds(-1));
Response.Cache.SetNoStore();
Response.AppendHeader("Pragma", "no-cache");

在Page_Load方法代码后面。

此外,我已为asp:ScriptManager添加了asp:TimerLogout.aspx

<asp:ScriptManager ID="ScriptManager1" runat="server"> 
</asp:ScriptManager> 
<asp:Timer ID="Timer1" runat="server" Interval="1000" ontick="Timer1_Tick" > 
</asp:Timer>

Timer1_Tick方法是:

protected void Timer1_Tick(object sender, EventArgs e) {
    FormsAuthentication.SignOut();
    Session.Abandon();
    FormsAuthentication.RedirectToLoginPage();
}

这是从Login.aspx重定向到Logout.aspx。另外,我在Logout.aspx中添加了以下JavaScript方法:

function disableBackButton() {
    window.history.forward(1);
}
disableBackButton();
window.onload = disableBackButton();
window.onpageshow = function (evt) { if (evt.persisted) disableBackButton() }
window.onunload = function () { void (0) } 

它正在工作,只有我单击“后退”按钮,或者单击多次暂停。但如果连续多次点击它,那么我将再次被放置在主页中。

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

我使用以下注销,我清除了cookie,并且我没有任何问题登出我的用户“真实”。

修改

请注意,浏览器通常会在其历史记录中缓存页面,我不认为您可以在注销后阻止它们显示页面!

FormsAuthentication.SignOut();
Session.Abandon();

// clear authentication cookie
HttpCookie cookie1 = new HttpCookie(FormsAuthentication.FormsCookieName, "");
cookie1.Expires = DateTime.Now.AddYears(-1);
Response.Cookies.Add(cookie1);

// clear session cookie
HttpCookie cookie2 = new HttpCookie("ASP.NET_SessionId", "");
cookie2.Expires = DateTime.Now.AddYears(-1);
Response.Cookies.Add(cookie2);

FormsAuthentication.RedirectToLoginPage();

答案 1 :(得分:1)

将以下代码添加到母版页的Page_Load以及问题中描述的其他技术:

Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.Cache.SetExpires(DateTime.Now.AddSeconds(-1));
Response.Cache.SetNoStore();
Response.AppendHeader("Pragma", "no-cache");

它会起作用。