Como hacer persistente la autenticación en ASP.NET mediante Cookies en Membership
Nota : Me he encontrado entre mis borradores este artículo que no publiqué en su momento, ya está desfasado pero quién sabe si le sirve a alguien por lo que lo publico ahora.
Puede daros el caso como el que yo tengo en el que vuestro proveedor de hosting limite el tiempo máximo de timeout de la sessión a un valor escaso para vuestro fin. Lo cual obliga a vuestros usuarios a tener que autenticarse cada vez que acceden a vuestra web. Para evitar esto y no depender del timeout de sesión podemos hacer persistente la autenticación mediante el uso de Cookies.
Las cookies son ficheros de texto de intercambio entre el explorador y el servidor que almacenan información relevante a la página web y de forma individual para cada usuario. Estos ficheros son almacenados en el equipo que usa el cliente y en algunos casos son objeto de fines malintencionados por lo que evitaremos guardar información confidencial y en nuestro caso almacenaremos un token o símbolo que identifique al usuario.
Cuando el usuario ha sido autenticado correctamente se crea la cookie a guardar en el cliente:
1: // Crea el contenedor de autenticación
2: FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1,
3: this.LoginUser.UserName,
4: DateTime.Now,
5: DateTime.Now.AddDays(Constantes.VariablesConfiguracion.AutenticationCookieDaysExpired),
6: true,
7: string.Empty);
8:
9: // Encripta the ticket de autenticación
10: string encTicket = FormsAuthentication.Encrypt(ticket);
11:
12: // Crea la cookie
13: HttpCookie galleta = new HttpCookie(Constantes.AutenticacionCookieName, encTicket);
14: galleta.Expires = ticket.Expiration;
15: Response.Cookies.Add(galleta);
Para recuperar la cookie almacenada seguiremos este otro código:
1: MembershipUser usuarioAutenticado = Membership.GetUser();
2:
3: // Comprueba si tiene una cookie almacenada para restaurar la autenticación
4: if (usuarioAutenticado == null)
5: {
6: // Se comprueba si hay una cookie almacenada
7: HttpCookie myCookie = Request.Cookies[Constantes.AutenticacionCookieName];
8:
9: // Lee la cookie y comprueba el usuario y si es válido lo da como autenticado
10: if (myCookie != null)
11: {
12: FormsAuthenticationTicket ticketRecupeado = FormsAuthentication.Decrypt(myCookie.Value);
13: string strUsuario = ticketRecupeado.Name;
14: MembershipUser usuarioCookie = Membership.GetUser(strUsuario);
15: if (usuarioCookie != null && usuarioCookie.IsApproved && !usuarioCookie.IsLockedOut)
16: {
17: FormsAuthentication.SetAuthCookie(usuarioCookie.UserName, true);
18: Response.Redirect(Request.Url.AbsoluteUri);
19: }
20: }
21: }
Y eliminamos la cookie cuando el usuario cierra la sesión manualmente.
1: // Desconecta al usuario activo y elimina sus cookies
2: HttpCookie myCookie = Request.Cookies[FormsAuthentication.FormsCookieName];
3: if (myCookie != null)
4: {
5: myCookie.Expires = DateTime.Now;
6: Response.Cookies.Set(myCookie);
7: }
Espero que os funcione.