2010-04-21 22 views
26

Estoy buscando una solución para que el usuario use el botón Atrás del navegador para navegar a la página anterior una vez que haya cerrado la sesión.autenticación de ASP.NET inicio de sesión y cierre de sesión con el botón Atrás del navegador

Tengo una compilación de aplicación web en asp.net y utilizando un proveedor de membresía personalizado para autenticación y autorización. Todo funciona bien, excepto cuando el usuario hace clic en el enlace de cierre de sesión para salir de la aplicación y ser redirigido a una página de portada predeterminada, si el uso hace clic en el BOTÓN ATRÁS en su navegador, en realidad volverá a donde estaba antes y los datos seguirán apareciendo.

Por supuesto que no pueden hacer nada en esa página, haga clic en cualquier enlace que se redirigirá a una página de inicio de sesión de nuevo. Pero que esa información se muestre está haciendo que los usuarios se sientan confundidos.

me pregunto si hay alguna manera de borrar el historial del navegador para que el uso no pueda regresar, o cuando hagan clic en el botón Atrás y hagan que lo redirijan a la página de inicio de sesión.

gracias

+1

+1 para una buena pregunta. +1 a la buena pregunta apenas supera -1 para una mala conclusión. –

+0

que estaba fuera de mi pereza ~ lo intentaré de nuevo – Eatdoku

Respuesta

21

preocuparse por el historial del navegador y el botón de retroceso se va a dar dolores de cabeza y las verrugas genitales. Hay instalaciones integradas para manejar este problema.

Su enlace/botón de desconexión debe apuntar a una página que contenga este código, junto con cualquier otra cosa que desee.

[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(); 
} 

Código proviene de esta page y es válida pero la página es difícil en los ojos.

Se puede encontrar una buena Pregunta/Respuesta con respecto al comportamiento del botón de retroceso here.

Actualización:

de conformidad con la conversación que estoy teniendo con Matthew, deshabilitar el almacenamiento en caché de las páginas individuales que son sensibles o volitile se puede hacer con un código como sigue:

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

soy curiosidad por saber si funciona para usted como lo hace para mí.

+3

Esta no es la respuesta a esta pregunta. – nima

+0

¿Esto también inhabilitará el almacenamiento en caché de css/js? Gracias: D –

+0

@Sky Sanders - Espera, ¿no le dijiste a alguien en una respuesta a continuación que Response.Cache.SetCacheability (HttpCacheability.NoCache) estaba "perdiendo la cabeza"? De todos modos, todavía me gusta su respuesta – deebs

3

Puede usar javascript para deshabilitar el botón Atrás (generalmente enviando al usuario a una página que lo reenvía a otra página, de modo que al hacer clic atrás se lo reenvía). Un usuario persistente aún puede retroceder 2 pasos en el historial y pasar por el ciclo.

Esa página está en el caché del navegador. Puede pedirle al navegador que no almacene en caché nada, pero esto arruinará el rendimiento, a veces de forma espectacular, por lo que no lo recomendaría.

+1

Matthew, ¿por qué sugerir un truco cuando hay una funcionalidad integrada para manejar el problema? –

+0

Session.Abandon y FormsAuthentication.SignOut no le dicen al navegador que borre su caché (y el navegador y los proxies intermedios no tienen que respetar un encabezado sin memoria caché) Las páginas en caché todavía se pueden cargar, y si la solicitud se realiza desde una página en el caché del cliente después de que la sesión se haya rechazado, sin decir cuál será el resultado, probablemente NullReferenceExceptions a medida que la página comienza a verificar variables de sesión (y un redireccionamiento a la página de inicio de sesión). – MatthewMartin

+0

Entonces no-cache debe establecerse discretamente en páginas sensibles o volátiles que no deberían resucitarse. No puedes controlar al cliente e intentar simplemente agrega complejidad. Si quieren respaldar 3 clics en una 'página ha expirado' después de cerrar la sesión ...?!?! más poder para ellos. De todos modos, no te estoy persiguiendo solo diciendo ... p.s. uso @sky para asegurarme de recibir respuestas a los comentarios. –

-3

en realidad encontré una solución, agregué el siguiente fragmento al método de carga de la página de la página maestra.

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

gracias por la respuesta de todos modos :)

+7

Oye, date la vuelta, creo que te has vuelto loco en algún lugar ... ;-p Esto es como tratar de arreglar un reloj con un mazo. Para decirlo amablemente, esto califica para un DWTF. Por favor reconsidera. –

+0

bien !! ... déjame intentarlo de nuevo :) – Eatdoku

0

puede intentar utilizar la HttpResponse.propiedad caché si eso ayuda:

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"]) 
{ 
//… 
} 

O podría podría bloquear el almacenamiento en caché de la página en conjunto con HttpResponse.CacheControl, pero ha sido desaprobado en favor de la propiedad por encima de caché:

Response.CacheControl = “No-Cache”; 

o podría realmente se vuelven locos y hacerlo todo a mano:

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

Este código es muy útil

Response.Cache.SetCacheability(HttpCacheability.NoCache); 

Sólo coloque este código en caso de carga, en la pagen principal en el caso, pero sólo funciona para IE, para IE y Firefox Solía ​​

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

Your Answer

Una solución a esto es agregar el siguiente código JavaScript a la sección de la página logout.aspx:

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

Este código javascript reenviará al usuario si el usuario llega a la página de cierre presionando el botón Atrás.

Si es necesario asegurarse de que el usuario no tiene ninguna manera de volver a las páginas después de que termine la sesión debe solicitar el navegador no hagan caché de cualquiera de las páginas mediante la inclusión de un código similar al siguiente en cada página:

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