Marc Rubiño

ASP.NET, C#, AJAX.NET, JavaScript, etc.

Iframe Cross Domain Cookie

Siguiendo con el infierno de los Iframes, hoy intentaremos utilizar el control Login de ASP.NET desde la página de un cliente que utiliza nuestra aplicación embebida.

 Lo primero que podemos pensar, es en que medida nos puede llegar a afectar trabajar con un iframe con el sistema de login que utilizamos con ASP.NET, para eso tenemos que diferenciar los dos pasos esenciales en la seguridad de nuestras aplicaciones.

Autenticación

La autenticación es el proceso mediante el cual se obtienen credenciales de identificación tales como el nombre de usuario y la contraseña, al tiempo que se validan dichas credenciales ante alguna autoridad.

ASP.NET proporciona cuatro proveedores de autenticación:

Autenticación de formularios
Autenticación de Windows
Autenticación Passport
Autenticación predeterminada

Autorización

La autorización es el proceso que verifica si el usuario autenticado tiene acceso a los recursos solicitados.

ASP.NET proporciona los siguientes proveedores de autorización:

FileAuthorization
UrlAuthorization

Más información en http://support.microsoft.com/kb/306590/es#3

Con esta definición podemos entender que nuestro control login lo que pretende hacer es Autentificar el usuario en nuestra aplicación para poder identificarlo y para eso utilizaremos la Autentificación de Formularios.

Autenticación de Formularios

La autenticación de formularios hace referencia a un sistema en el que la solicitudes no autenticadas se redirigen a un formulario de Lenguaje de marcado de hipertexto (HTML) en el que los usuarios escriben sus credenciales. Una vez que el usuario proporciona las credenciales y envía el formulario, la aplicación autentica la solicitud y el sistema emite un vale de autorización en el formulario de una cookie. Esta cookie contiene las credenciales o una clave para readquirir la identidad. Las solicitudes subsiguientes del explorador automáticamente incluyen la cookie.

Ahora que ya conocemos el mecanismo de autentificación y la manera que tiene para persistir esta información podemos suponer cual será el problema, nuestra aplicación al autentificar al usuario e intentar persistir sus credenciales se encuentra que el dominio que intenta guardar la cookie no es el mismo que esta corriendo la página web, ups ( problema de seguridad - Cross Domain Cookie ).

Miremos como funcionaría la aplicación si no utilizara un Iframe.

  1. La aplicación nos redirige al formulario de Autentificación.
  2. Introducimos nuestros datos para identificarnos.
  3. Si los datos de usuario son correctos nos redirige a la página principal mostrándonos el nombre de usuario

Que pasa cuando hacemos lo mismo desde un iFrame:

  1. La aplicación nos redirige al formulario de Autentificación.
  2. Introducimos nuestros datos para identificarnos.
  3. Como la identificación del usuario ha sido correcto nos redirige a la página principal pero no nos muestra la información del usuario, porque no ha podido guardar la cookie con sus datos.

Para solucionar este problema nos viene a rescatar P3P  "un lenguaje estándar que ofrece a los usuarios una forma sencilla y automatizada de controlar en mayor medida el uso que se hace de su información personal en los sitios Web que visitan".

Tenemos dos opciones a la hora de utilizar p3p para poder guardar la cookie de usuario con éxito.

  1. Crear una cabecera en nuestro directorio virtual para nuestra aplicación.
  2. Crear la cabecera en el formulario de Login para que solo afecte a esa página.

Nosotros utilizaremos la segunda opción.

    protected void Page_Load(object sender, EventArgs e)

    {

        HttpContext.Current.Response.AddHeader("p3p", "CP=\"CAO PSA OUR\"");

    }

Ya le podemos decir a nuestro cliente que podemos controlar a los usuarios registrados en nuestra aplicación embebida en su sistema. ;-)

Cross-Posting desde www.lonetcamp.com

 

Posted: 2/3/2008 21:45 por Marc Rubiño | con 6 comment(s)
Archivado en: ,,
Comparte este post:

Comentarios

raul ha opinado:

No entiendo que queres decir...la cookie se guarda siempre sea un iframe o no...no veo el problema. Se podria aclarar?

Saludos

Raúl

# January 20, 2009 8:50 PM

Marc Rubiño ha opinado:

Hola Raul, como he comentado en el artículo.

" nuestra aplicación al autentificar al usuario e intentar persistir sus credenciales se encuentra que el dominio que intenta guardar la cookie no es el mismo que esta corriendo la página web, ups ( problema de seguridad "

Tienes más información del tema en este link geeks.ms/.../las-dichosas-cross-domain-calls.aspx

Saludos

# January 20, 2009 10:48 PM

Karlos ha opinado:

saludos, disculpa creo que tengo un problema con algo que tiene que ver qon lo que explicas, mi detalle es este, tengo una pagina donde logueo, al loguear me manda al default, el cual es un contenedoro con un frame  y en el frame es donde realmente tengo las pagians que usa el cliente, usa valores con variables de sesion, pero se pierde la sesion despues de un tiempo y m ecausa errores, como podria mantener esa sesion?? o en su defecto como usaria coockies para pasar esos datos?? el detalle es que uso ajax y cuando uso el updatepanel no permite usar el Response, gracias

# April 16, 2009 5:44 PM

Roberto ha opinado:

Y como seria para el caso 1

Crear una cabecera en nuestro directorio virtual para nuestra aplicación. ?

Saludos

Roberto

# August 8, 2009 5:59 PM

Ariel ha opinado:

¿Y esta magia? Dudo mucho que funcione, en que puede ayudar una lína en el header.

# May 5, 2011 3:23 PM

Luis ha opinado:

Hola. Tengo una consulta, no sé si me puedas ayudar. Tengo un página en un dominio "ABC". Esa página, está colocada en un IFRAME en un dominio cliente "XYZ". Mi página maneja una sesión para guardar los datos ya que es un carrito de compras. La configuración de la sesión, en el Web.config, es la sgte:

<sessionState mode="StateServer" cookieless="true" timeout="20"/>

Este carrito de compras, debo integrarlo con una página de un proveedor con un dominio diferente al mio y al de mi cliente. Esta integración consiste en enviarle unos parámetros vía POST y luego de esto recibir la respuesta del proveedor a través de un POST. El problema es que, cuando el proveedor debe enviarme sus datos a través del POST, no logro recibirlos a menos que, en el ACTION de su formulario esté el ID de la sesión, por ejemplo:

<form method="post" action="http://www.midominio.com/(S(XXXXXXX))/respuesta.aspx">

Por ello, tendría que pasarle, por parámetro, el ID de mi sesión para que lo concatene en el action de su formulario y pueda recibir los valores sin problemas. Si bien es cierto, esto último se puede desarrollar sin problemas, mi pregunta es: por qué es necesario que, al hacer el POST, se tenga que colocar el ID de la sesión, si en ese momento no la estoy usando?

Lo único que se me ocurre es quitar el atributo cookieless="true" del Web.config, pero tendría problemas al generar la sesión dentro del IFRAME.

Espero puedas ayudarme.

Gracias

# June 17, 2011 10:31 PM