La cuestión es la siguiente, tenemos un sitio que debe manejar seguirdad, este contiene una primera pagina donde se ubica un control de login para permitir el acceso, cuando el usuario entrega las credeciales (login, pwd) el sistema lo autentica y re-envia a una pagina digamos “segura” puesto que ya se identifico, el problema nace cuando el usuario presiona el boton “atras” del navegador y luego el boton de “adelante”, el sistema permite que salga y entre de la aplicación sin pedir de nuevo las credenciales, en algunos casos el sistema deberia hacer logout para permitir que nuevamente el usuario se identifique, y no permitir el acceso a la pagina segura si el usuario no vuelve a digitar sus datos, la pregunta es ¿porque ocurre esto?, la cuestion es que cuando se presionan estos botones del navegador no se hace post back de las paginas es decir no se vuelven a cargar.

Cual seria entonces la solución,… pues evitar que la pagina se guarde en el cache y de esta manera se solicite de nuevo al servidor, ¿como lo hacemos?, esta es una de las formas… existen varias…

1. Debemos crear un perfil de cache en el archivo de configuración que nos permita definir un tiempo de duración igual a cero para las paginas que no queremos almacenar en cache así:

    <caching>
      <outputCacheSettings>
        <outputCacheProfiles>
          <add name=”ninguna” duration=”0″ />
        </outputCacheProfiles>
      </outputCacheSettings>
    </caching>   

2. En mi caso he creaado dos paginas la pagina Default y una pagina llamada PaginaSegura, el usuario para entrar en la PaginaSegura sebe primero hacer login en Default quien establece mediante la membresia de ASP.NET si el usuario esta autorizado, pero cada vez que se hace Page_Load se hace logOut este es el codigo de la pagina default:

    protected void Page_Load(object sender, EventArgs e)
    {
        //Siempre que se cargue esta pagina se hace SignOut();
        FormsAuthentication.SignOut();
    }
    protected void ctrLogin_Authenticate(object sender, AuthenticateEventArgs e)
    {
        //Si el usuario existe en el sistema de membrecia
        if (Membership.ValidateUser(ctrLogin.UserName, ctrLogin.Password))
        {
            //Establecemos que ya se ha logueado
            FormsAuthentication.SetAuthCookie(ctrLogin.UserName, ctrLogin.RememberMeSet);
            //redirecicionamos a la pagina segura
            Response.Redirect(“PaginaSegura.aspx”);
        }
    }

3. Establecemos el parfil de cache para las dos paginas y de esta forma garantizamos que no se almacenen en la cache, mediante la directiva

<%@ OutputCache CacheProfile=”ninguna” VaryByParam=”Id” %>

… con estos simples pasos podemos garantiza que cada vez que el usuario entre a la pagina de login entregue las credenciales para que pueda acceder al contenido seguro, sin preocuparnos por la visualización de datos que pudieron quedar en cache.

4. Por ultimo y lo mas importante (se me estaba olvidando…), deben tener publicado el sitio con IIS, no se pude deshabilitar el cache en el modo de Desarrollo, espero les sea de utilidad.