Inicio de Sesión con otra Aplicación

Hola gente, hoy quería hablar sobre un tema que busque mucho en internet y no encontré, se trata de iniciar sesión desde mi aplicación pero con otra aplicación.

Actualización:

ESTE EJEMPLO ES PARA APLICACIONES QUE SE ENCUENTRAN DENTRO DE UN MISMO DOMINIO, DONDE TODAS LAS APP QUE SE CREAN ESTARÁN COLGADAS BAJO ESTE DOMINIO.

Imaginen esto, una empresa tiene una aplicación web que se loguean todos los empleados, pero al empezar a crecer esta empresa, empieza a tener otras aplicaciones donde trabajan los mismos empleados, son distintas funcionalidades para las cuales se emplean estas aplicaciones, donde son los mismos empleados y es como engorroso tener que hacer un administrador de usuarios para cada app, cuando solo necesitas saber si es de la empresa y darle permisos,  bueno el requerimiento es el siguiente:

Hacer una aplicación de inicio de sesión único para todas las aplicaciones que estén o que se realicen a futuro.

Para este ejemplo vamos a realizar lo siguiente, tendremos 3 aplicaciones.

Donde App1 es la de logueo y las otras dos App2 y App3 son aplicaciones simples

1. En nuestra App1 en la página de loguin en el botón de inicio le creamos un método para cuando haga clic o en su defecto si es MVC en el Controlador que inicia sesión.

protected void LoginButton_Click(object sender, EventArgs e)
{
  if (Membership.ValidateUser(LoginUser.UserName, LoginUser.Password))
  {
    FormsAuthentication.SetAuthCookie(LoginUser.UserName, true);
    FormsAuthentication.RedirectToLoginPage();
  }
}

2. En el web.config de la App1 agregamos el name a la validación, de la siguinte forma

<authentication mode="Forms">
      <forms loginUrl="~/Account/LogOn" name="appDeLogueo" timeout="2880" />
    </authentication>

en esta parte es importante remarcar que se le agrego el tag name.

3. Ahora nos vamos a nuestras App2 y App3 que aquí he elegido usar MVC 2 y MVC 3, nos vamos al web.config y ponemos lo siguiente

<authentication mode="Forms">
   <forms loginUrl="http://localhost:8568/Account/Login.aspx" 
          name="appDeLogueo" 
          timeout="2880" />
 </authentication>
 <authorization>
    <deny users="?"/>
 </authorization>

4. Ahora nos vamos al archivo global.asax y agregamos el siguiente metodo

protected void Application_AuthenticateRequest(Object sender, EventArgs e)
 {
     var cookieName = FormsAuthentication.FormsCookieName;
     var authCookie = Context.Request.Cookies[cookieName];
     if (null == authCookie)
     {
        Response.Redirect("http://localhost:8568/Account/Login.aspx?ReturnUrl=" + Request.Url.AbsoluteUri);
     }
 }

Si miran bien van a notar que he puesto un Redirect forzado donde más allá que lo indique en el web.config la directiva de logueo, acá lo que hago es agregarle el QueryString de ReturnUrl pero con el path completo, porque sino lo que sucede es que re direcciona pero el solamente al hash y al retornar termina buscando el retorno a ese hash dentro de su propio dominio.

Bien ahora ya podemos ejecutar nuestras aplicaciones y veremos que nos re direcciona a la pagina de loguin y una vez que hacemos loguin nos comparte las credenciales para luego volver a la pagina que pidio el inicio de sesión sin importar el dominio.

image

Un dato interesante es si tildamos el check de recordar usuario cuando iniciamos sesión después abrimos las otras web y estas directamente ya no van a la pagina de inicio  solamente saben que ya alguien se logueo y buscar los datos a partir de la cokie que pasamos en el web.config entonces trae las credenciales sin intervención de nada más.

Bueno de ante mano pido disculpas si he indicado algo erróneo, la verdad que no soy un experto en seguridad de aplicaciones, pero me pareció interesante demostrar como podemos hacer una simple aplicación de inicio de sesión para que otras web solo utilicen el logueo contra esta y así tener las mínimas credenciales, la verdad que esto nos llevo un buen rato descubrir como hacerlo con mi compañero Aldo pero al fin dimos con la tecla.

Hay mucho más como STS para realizar cosas más sofisticadas como autenticar contra distintos sistemas como Google, Windows Live ID, Servicios Azure etc,, para ver ejemplos en video pueden visitar el canal de Youtube de la Comunidad de Technet y MSDN de Microsoft http://www.youtube.com/user/technetymsdn, ahí tambien van a encontrar un montón de videos de los eventos que realiza Microsoft como el Run Web Camp que se realizo en Buenos Aires.

Desde ya gracias por pasar por aquí y cualquier duda me mandan un menaje a mi mail que es moises.rivas@msptechrep.com chau y nos vemos en la próxima.

Anuncios

3 Comentarios Agrega el tuyo

  1. Buenisimo y util, marcha post alos marcadores¡¡¡¡¡

  2. Pues… mucho me temo que esto, realmente no te va a funcionar 🙂

    Te cuento, en tu caso te funciona porque las 3 aplicaciones las tienes EN EL MISMO DOMINIO (localhost).
    Pero si están en dominios distintos (lo normal) entonces el browser no enviará las cookies a todas las aplicaciones. Por definición los browsers sólo envían las cookies de los dominios en los cuales se han originado inicialmente. Con lo qual, si la aplicación “inicial” la tienes en a.com y otra la tienes en b.com, la de b.com no recibirá la cookie generada en a.com y no estará autenticada.

    Hacer sistemas de single-sign-on es bastante complicado, pero si realmente te interesa el tema un estándard que se usa bastante es oAuth o alguna variación como xAuth.

    😉

    Un saludo!

    1. Hola Eduard gracias por tu comentario, te cuento que esto funciona pero de la forma que comento en el post, lo único que me falto fue hacer esta aclaración que haces tu al indicar que solo funciona dentro de un mismo dominio, era la idea pero al terminar de escribir no visualice esta advertencia, al contrario al principio comento en el ejemplo que es para una empresa que tiene varias App… donde me falto poner que tiene un dominio y donde cuelga todas sus App a partir de esta, pero mil gracias por aportar y pasar por mi blog, ahora actualizo este post, un abrazo.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s