Click here to Skip to main content
65,938 articles
CodeProject is changing. Read more.
Articles
(untagged)

Disable Secure Page Cache

0.00/5 (No votes)
26 Nov 2014 1  
This tip will address the issue of expiring the page when browser buttons are used for navigation of application.

Introduction

Why do we need to expire the web page when browser back/forward button is clicked? It is one of the security concerns that if any user using any public shared computer left the browsed page open, the bad guy can sneak peak in to your information by using browser back/forward buttons.

Using the Code

Part 1

First of all, add the following response properties in your Page_Load function and don't put this code in if(!IsPostback) code block in Page_Load function. See sample code as below:

protected void Page_Load(object sender, System.EventArgs e)
  {                    
            if (!Page.IsPostBack)
            {
                // you Logic here               
            }
           
            Page.Response.Cache.SetCacheability(HttpCacheability.NoCache);
            Page.Response.Cache.SetNoStore();
            Page.Response.Cache.AppendCacheExtension("no-cache");
            Page.Response.Expires = 0;          
  }

If there is any action or postback, then the below mentioned lines will work and expire the page.

 Page.Response.Cache.SetCacheability(HttpCacheability.NoCache);
 Page.Response.Cache.SetNoStore();
 Page.Response.Cache.AppendCacheExtension("no-cache");
 Page.Response.Expires = 0;

Part 2

Now to add your own logic to cater to pages where we don't have any postback.

Add the following code in your Page_Load function if(!IsPostBack) check as below:

We have taken one Session variable "TimeStamp" and one ViewState variable "TimeStamp".

When the web page is loaded with any navigation link inside the application, we have Session["TimeStamp"] and ViewState["TimeStamp"] variable value "null" and that means browser buttons are not clicked and we don't have to expire the Page.

Whenever the user clicks the browser back/forward button, the ViewState will become null for that page and Session will contain the "TimeStamp" so we infer that browser button is clicked and we need to expire the page and redirect it to a page. In our case, we redirect to WebPageExpire.aspx.

 protected void Page_Load(object sender, System.EventArgs e)
  {                    
            if (!Page.IsPostBack)
            {
                // you Logic here
                if (isPageExpired())
                   {
                        Response.Redirect("WebPageExpire.aspx");
                   }
               else
                  {
                       string strNow = DateTime.Now.ToString();
                       Session["TimeStamp"] = strNow;
                      ViewState["TimeStamp"] = strNow;
                  }
            }
           
            Page.Response.Cache.SetCacheability(HttpCacheability.NoCache);
            Page.Response.Cache.SetNoStore();
            Page.Response.Cache.AppendCacheExtension("no-cache");
            Page.Response.Expires = 0;          
  }

Now, add the function isPageExpired() which compares the Session ["TimeStamp"] and ViewState["TimeStamp"].

private bool isPageExpired()
   {
            if (Session["TimeStamp"] == ViewState["TimeStamp"])
                return false;
            else
                return true;
   }

One more thing from wherever you are navigating either asp:Button, asp:Link, etc., we have to initialize the Session["TimeStamp"]= null so that every time when we navigate legitimately, our Session and Viewstate have the same value.

protected void BtnRegister_ServerClick(object sender, System.Web.UI.ImageClickEventArgs e)
{
    Session["TimeStamp"] = null;
    Response.Redirect("Register.aspx", false);
}

We have to add the same logic in every page where we need secure cache disable functionality plus you have to design a page. In my case, I have designed the page WebPageExpire.aspx and show message to user:

WebPage has expired please login again.

I hope this will solve the problem and I am looking forward to hearing from you guys.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here