2010-01-25 32 views
5

Tengo una aplicación MVC que utiliza [Autorizar] para proteger los bits privados. Cuando selecciono la URL de SignOut(), me cierra la sesión, pero si presiono el botón Atrás en mi navegador, irá a la página segura e incluso me permitirá usar el formulario. La acción tiene lugar y luego muestra que he cerrado la sesión. El problema es que realiza la acción segura (insertando una fila en mi base de datos). Entonces puedo usar el botón Atrás otra vez y hacerlo todo de nuevo. Si utilizo el botón Atrás después de cerrar la sesión y presiono la actualización del navegador, se muestra que estoy desconectado y me niega el acceso a la página segura.Usar el botón Atrás del navegador después de que SignOut() permita el acceso a la página segura (ASP.NET MVC)

¿Falta algo importante? Parece que podría ser un gran problema de seguridad.

public ActionResult LogOff(string ReturnUrl) 
{ 

    FormsAuth.SignOut(); 

    if (!String.IsNullOrEmpty(ReturnUrl)) 
    { 
     return Redirect(ReturnUrl); 
    } 
    else 
    { 

    return RedirectToAction("Index", "Page"); 
    } 
} 
+4

Olvidó envolver [Autorizar] en torno a la acción que acepta la publicación (arriba [AcceptVerbs (HttpVerbs.Post)]? Sin – Langdon

+0

pero cuando volvió a tener una mirada que tenía la siguiente manera: \t \t [AcceptVerbs (HttpVerbs.Get)] \t \t [Autorizar (Roles = "Administrador")] y \t \t [AcceptVerbs (HttpVerbs .Publicación)] \t \t [Autorizar (Roles = "Administrador")] Cuando coloco el distintivo de Autorizar antes de AcceptVerbs tanto para Obtener como Publicar, todavía me permite volver al formulario pero no me deja publicarlo . – mark123

+0

Todavía me gustaría que no muestre la forma segura si le permite publicarla o no. Este es un problema extraño. Al utilizar la decoración [Autorizar], no debería tener que hacer una prueba para IsAuthenticated, ¿o sí? \t \t \t if (! User.Identity.IsAuthenticated) {return RedirectToAction ("LogOn", "Account");} – mark123

Respuesta

5

Creo que el problema es que el navegador almacena en caché la página. Es por eso que no vuelve a cargar la página después de hacer clic en el botón Atrás. Si especifica en los encabezados que la página no se debe almacenar en caché, debería volver a cargar la página después de presionar el botón Atrás. Y luego el usuario es rechazado.

Sin embargo, para que funcione puede ser complicado en algunos casos. Vea esto Caching Tutorial para más información.

1

¿Está utilizando alguna información de sesión? FormsAuth.SignOut() solo afecta a las nuevas instancias de una página. Cuando regresó, estaba autorizado a estar allí (anteriormente). Se permite PostBack a menos que tenga un código que compruebe la cookie/sesión/autenticidad de la solicitud. Incluso pasa por alto el archivo.asax global porque ViewState ya está generado.

Es posible que desee agregar una declaración de aniquilación de sesión o proporcionar algunos controles de autenticación adicionales en sus clases base para asegurarse de que un usuario está realmente autorizado para estar donde están, CUÁNDO sí.

Como alternativa, puede desactivar el almacenamiento en caché de la página, lo que debería hacer que el botón de retroceso sea bastante inútil (proporcionará la página expirada por defecto). Esto creará rareza para los usuarios que confían en el botón Atrás, pero ayudará a garantizar la seguridad de la página porque forzará una "reedición" de la página en primer lugar.

+0

Está usando MVC, por lo que las devoluciones de mensajes y los estados de visualización no deberían ser un problema. Sin embargo, usar 'Session.Abandon()' en el control de cierre de sesión es una buena idea. –

+0

No estoy usando información de sesión en este caso. – mark123

3

Limpiar la sesión puede ayudar. aquí está mi método de salida:

public ActionResult Signout() 
    { 
     Session.Clear(); 
     FormsAuthentication.SignOut(); 
     return RedirectToAction("Index", "Home"); 
    } 
1

esto es a la respuesta tardía pero espero ayudar a alguien en un momento en Global.asax añadir este método

protected void Application_BeginRequest() 
{ 
    Response.Cache.SetCacheability(HttpCacheability.NoCache); 
    Response.Cache.SetExpires(DateTime.UtcNow.AddHours(-1)); 
    Response.Cache.SetNoStore(); 
} 

y después de la acción principal añadir esta comprobación

if (Request.IsAuthenticated) 
{ 
    // do something 
} 
else 
{ 
    return RedirectToAction("LoginPage", "ControllerName"); 
} 

(acción principal significa cualquier acción [httpget]) y funcionará mucho espero ayudar

Cuestiones relacionadas