miércoles, 26 de mayo de 2010

ASP.NET - Sesion expira en iframe

Vamos a analizar esta situación:
Tenemos una aplicación ASP.NET, y una de las páginas aspx (Padre.aspx) incluye en su código un iframe (hijo.aspx)… este iframe carga reportes para determinados días, según las fechas que vaya eligiendo en los dropdownlists la aplicación hace autopostback y carga otro reporte, más o menos así sería la idea:
<iframe id="mainiFrame" runat="server" name="mainiFrame" src="hijo.aspx" scrolling="no" frameborder="0" width="100%"></iframe>
iframe0
la aplicación está basada en formularios y, cuando la sesión está activa, no hay problema… los reportes se muestran muy bien, todo chévere hasta allí.
La pregunta es:

qué pasa si, de pronto me dieron ganas de revisar mi facebook y sin darme cuenta ya transcurrieron como 30 minutos revisando información y fotos de mis amigos…

ahora, regreso a seguir viendo mis reportes, elijo una opción de los dropdownlists y…. qué pasó???

diablos!!!!…. la página de login está dentro de la página padre.aspx
iframe1

ahhhhh, lo que pasó es que al estar 30 minutos sin actividad en la aplicación ASP.NET, la sesión expiró… pero recién se nota en la página que intenta hacer actividad de nuevo.

Aunque parezca simple, esto es un gran problema… porque si el usuario ingresa sus datos correctamente para autenticarse, la autenticación efectivamente se realizará, pero todas las páginas estarán dentro de la página padre.aspx… imagínate si en la página padre hubiera una barra de botones, en la página que está contenida dentro del padre también se repetiría la misma barra de botones,….

Para evitar caer en estos casos, hay una solución muy simple, simplemente pones este código javascript en la página que usas para autenticarte, en mi caso login.aspx:

<script type="text/javascript">
function CheckIfPageIsInFrame() 
{
var isInIFrame = (window.location != window.parent.location) ? true : false;
if (isInIFrame) 
{
window.parent.location = "Login.aspx";
}
}
window.onload = CheckIfPageIsInFrame();
</script>


Lo que hace este código es verificar si la página login.aspx está dentro de otra página, si lo está: el script redirecciona a la página padre hacia la página login.aspx… con lo que se se pierde el iframe.

Este script también sirve para asegurarte que nadie muestre tu pagina aspx dentro de un iframe, sin tu permiso.

Espero que les sea de utilidad ;)

1 comentario:

Paranormal Hunter dijo...

Excelente aporte. Desde hace mucho tiempo tenía este problema en mi ERP web. Un saludo.