>

Junio 9

2018

El sistema de autenticación de usuarios en ASP.NET es bastante completo, pero aún así hay veces que es demasiado simple y no nos proporciona fácilmente mecanismos para almacenar todo lo que nos gustaría.

Un ejemplo es el ID de usuario, que normalmente lo almacenamos en alguna tabla de una base de datos cuando el usuario se identifica, o en una variable de sesión, o en una cookie propia.

La primera opción implica tener que consultar la base de datos cada vez que queremos conocer el ID, por lo que el rendimiento del sistema se puede ver afectado.

Con la segunda corremos el riesgo de que, si el servidor reinicia o tiene algún fallo o cambio de código, perdamos las variables de sesión, por lo que perdemos el ID del usuario activo.

En la última, nos implica tener que mantener nosotros dicha cookie y estar creando mecanismos de protección de datos para que no se sepa para que se utiliza esa información.

HttpContext.Current.User.Identity o Page.Identity

Dentro de este objeto podemos obtener de forma simple y rápida acceso a conocer si el usuario está autenticado, y si lo está, conocer el nombre de usuario.

Pero en ocasiones no es solo el nombre de usuario lo que nos interesa, es también el ID del usuario, obviamente solemos trabajar mas con el ID que con el nombre para localizar el usuario en una base de datos o en nuestro código en general.

Este dato lo asignamos dentro de la clase FormsAuthentication cuando hacemos el inicio de sesión.

FormsAuthentication.SetAuthCookie([Nombre Usuario], [true,false]);

Una de las soluciones que utilicé inicialmente es almacenar ahí el ID del usuario, pero esto no es una buena práctica, además, porque es una forma rápida de poder acceder el Nombre del Usuario sin necesidad de conectar con la base de datos.

Otra de las soluciones que he utilizado es almacenar ahí el NOMBRE DE USUARIO para identificarse en el sistema, que normalmente es único también, pero nos encontramos con la misma tesitura, hay que hacer una consulta a la base de datos para conocer el ID y ésto relentiza la página web.

Utilizar y modificar el Ticket de la cookie

La solución la encontré en este post que hace referencia a MVC y es un poco antiguo, pero tras leerlo y haciendo mis investigaciones dentro de Page.Identify  o HttpContext.Current.User.Identity se me iluminó el bombillo y me puse manos a la obra para implementarlo, y de verdad que me funcionó.

Primer paso

Tras autenticar al usuario y después de guardar el nombre, o lo que queramos en la propiedad HttpContext.Current.User.Identity.Name Page.Identify.Name,con FormsAuthentication.SetAuthCookie, crearemos un objeto FormsAuthenticationTicket para poder acceder a las propiedades de este objeto y poder utilizar la propiedad userdata. Esta es una propiedad de tipo string donde podemos almacenar lo que queramos, y ya dependiendo de cuantos datos quieras almacenar, pues dependerá como guardar la información.

Podrías utilizar un string en formato JSON o separado por algún tipo de separador como ; o , o #. En mi caso solo necesito almacenar el ID por lo que no le he dado ningún tipo de formato.

FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(2, [NOMBRE DE USUARIO], DateTime.Now, DateTime.Now.AddMinutes(15), [true,false], [ID]);

Ahora tenemos que almacenar este nuevo ticket en la cookie que crea ASP para almacenar el inicio de sesión de tu usuario. Esta cookie suele tener un nombre automático o se lo podemos asignar en el web.config pero realmente no necesitamos conocer dicho nombre ya que ASP nos proporcional a propiedad FormsAuthentication.FormsCookieName que almacena dicho nombre y nos despreocupamos de ello.

Creamos un objeto HttpCookie y lo rellenamos con el ticket que hemos creado, encriptando la información, por supuesto.

HttpCookie myTiket = new HttpCookie(FormsAuthentication.FormsCookieName, FormsAuthentication.Encrypt(tiket));
HttpContext.Current.Response.Cookies.Add(myTiket);

Segundo Paso

Por último cuando necesitemos conocer el ID solo tenemos que recuperar dicha cookie, desencriptarla, almacenarla en un objeto ticket y acceder a la propiedad userdata para conocer el ID. Para un lío pero es más sencillo de lo que parece.

//recuperar la cookie
HttpCookie myTiket = new HttpCookie(FormsAuthentication.FormsCookieName, FormsAuthentication.Encrypt(tiket));
HttpContext.Current.Response.Cookies.Add(myTiket);

//crear el objeto del ticket desencriptando la cookie
HttpCookie authCookie = HttpContext.Current.Request.Cookies[System.Web.Security.FormsAuthentication.FormsCookieName];
System.Web.Security.FormsAuthenticationTicket authTicket = System.Web.Security.FormsAuthentication.Decrypt(authCookie.Value);

//recuperar el ID
ID = authTicket.UserData;

Listo

Con estas pocas líneas de código puedes implementar una forma rápida y eficiente para almacenar y recuperar el ID del usuario sin tener que estar accediendo a la base de datos o utilizando otros mecanismos un poco mas lentos o inseguros.


Happy coding


#ASP #CSHARP #seguridad #web


0 Comentarios



Archivo