Nota del autor

Si la entrada que estás leyendo carece de imágenes, no se ve el vídeo que teóricamente lleva incrustado o el código fuente mostrado aparece sin formato, podéis conocer los motivos aquí. Poco a poco iré restableciendo la normalidad en el blog.
Este blog es un archivo de los artículos situados previamente en Lobosoft.es y ha dejado de ser actualizado. Las nuevas entradas pueden encontrarse en www.lobosoft.es. Un saludo,
Lobosoft.

lunes, 4 de agosto de 2008

Control de acceso de un usuario en ASP.NET

Hacía tiempo que deseaba escribir algo sobre ASP.NET, una tecnología con la que he trabajado durante varios años y que en lo s últimos meses he dejado un poco de lado debido a que en el trabajo me estoy decantando por otro tipo de proyectos más cercanos a la parte de programación de sistemas y redes. Sin embargo, y aun a pesar de sus numerosas peculiaridades, ASP.NET es una tecnología muy interesante que recomiendo a aquellos que deseen adentrarse en el mundo de la programación web de aplicaciones empresariales.


La entrada de hoy está relacionada con la seguridad de nuestras aplicaciones. Habitualmente, las aplicaciones web permiten a los usuarios conectarse desde lugares remotos a nuestros servidores para ejecutar consultas, introducir datos o efectuar cualquier tipo de cálculo o trabajo. Esto se solventa fácilmente mediante un sencillo sistema de autenticación, bien sea mediante autenticación Windows, bien a través de la autenticación de Passport o a través de formularios. Sin embargo, es posible que nuestros usuarios se conecten varias veces desde diferentes navegadores ocupando varias sesiones, y podría interesarnos que esto no sea así. Hoy veremos un sencillo método para validar en la página de login de nuestra aplicación si un determinado usuario se ha autenticado previamente en el sistema, y en caso de ser así, no permitirle acceder a la aplicación hasta que termine la sesión, bien manualmente, bien por expiración de la misma.


En sí, el ejemplo está constituido por un par de páginas, una inicial de login (Default.aspx) y otra accesible desde aquella (Lobosoft.aspx). En la primera, el usuario se autentica mediante su nombre de usuario y password. Esta tupla se valida de algún modo (en el ejemplo, simplemente mediante un método que los comprueba, pero en un caso real se produciría una validación contra una base de datos o un LDAP, por ejemplo). Si el usuario existe y su contraseña es correcta, se comprueba entonces que no haya accedido previamente al sistema. Para ello, sus datos son almacenados en la caché de la aplicación (para prever la expiración por tiempo) y su nombre de usuario en la sesión. En ese momento es redirigido a la página “de trabajo”, Lobosoft.aspx. El usuario puede volver mediante un enlace a la página anterior, y si intenta volver a identificarse el sistema le indicará que ya está registrado. Para poder volver a identificarse, debería cerrar la sesión mediante el enlace “Salir” (que limpia de la caché sus datos).


Como decía, el código es muy simple, y está basado principalmente en el método UniqueLogin(), en Default.aspx, que comprueba si el usuario se registró previamente, actuando en consecuencia.


[csharp]
private bool UniqueLogin(string user)
{
string myUser = Convert.ToString(Cache[user]);

// Si el usuario es nulo o cadena vacía...
if (myUser.ToString() == String.Empty)
{
TimeSpan SessTimeOut = new TimeSpan(0, 0, HttpContext.Current.Session.Timeout, 0, 0);
HttpContext.Current.Cache.Insert(user, user, null, DateTime.MaxValue, SessTimeOut,
System.Web.Caching.CacheItemPriority.NotRemovable, null);

Session["user"] = user;

return true;
}
else
{
return false;
}
}
[/csharp]

Y en Lobosoft.aspx, una limpieza de la caché en caso de terminar la sesión:


[csharp]
Cache[(string)Session["user"]] = string.Empty;
[/csharp]

Dejo el código accesible para su descarga en el siguiente enlace:


[download#11]


Más adelante me gustaría mostrar cómo impedir que una determinada sección de nuestra aplicación se ejecute varias veces por uno o más usuarios a la vez, e incluso que se impida “compartir” URLs entre usuarios, siendo estas únicas para una determinada ejecución de la aplicación, algo que ya tuve que implementar en el pasado y que me pareció ciertamente útil en determinadas situaciones.

5 comentarios:

  1. Saludos,
    muchas gracias por la info, aparte de este articulo de gran ayuda me gustaria saber acerca del control de acceso de los usuarios pero desde varios equipos, de tal forma que solo permita un acceso por usuario a la vez, te agradeceria que pudieras publicar algo al respecto, saludos y que estes bien.

    ResponderEliminar
  2. hola a todos, estoy intentando conocer asp.net pero con vb2008 por favor ese codigo q esta n c#, me lo podrian dar en visual basic 2008 por favor.. se los agradeceria..

    ResponderEliminar
  3. @Alex:

    La conversión de C# a VB.NET es prácticamente directa. Basta con copiar el código en un conversor, si no te resulta fácil traducirla. Te recomiendo éste, que está disponible on-line:

    http://www.developerfusion.com/tools/convert/csharp-to-vb/

    En concreto, para el código que hay arriba, la equivalencia sería la siguiente:

    Private Function UniqueLogin(ByVal user As String) As Boolean
    Dim myUser As String = Convert.ToString(Cache(user))
    ' Si el usuario es nulo o cadena vacía...
    If myUser.ToString() = [String].Empty Then
    Dim SessTimeOut As New TimeSpan(0, 0, HttpContext.Current.Session.Timeout, 0, 0)
    HttpContext.Current.Cache.Insert(user, user, Nothing, DateTime.MaxValue, SessTimeOut, System.Web.Caching.CacheItemPriority.NotRemovable, _
    Nothing)
    Session("user") = user
    Return True
    Else
    Return False
    End If
    End Function

    ResponderEliminar
  4. gracias por tu ayuda, una pregunta mas como hago en vb para validar el login y passwors usando sql server2005 en asp.net usando la herramienta login.

    ResponderEliminar
  5. Buenas Alex.

    No hay de qué. Respecto a lo que comentas, de momento ando muy liado como para escribir algo propio, aunque sería interesante. Por curiosidad he visto algo sobre lo que me preguntas, y creo que el enlace a la MSDN que te paso aquí puede resultarte interesante.

    Suerte con la aplicación.

    Un saludo,

    Mith.

    ResponderEliminar