Autentificación de usuarios en un sitio web

WebProgramacion > Recursos sobre informática y tecnología > Programacion > C# > Autentificación de usuarios en un sitio web
C#
Autor: Dámaso Velázquez Álvarez

En este breve tutorial vamos a revisar la manera de realizar una gestión de usuarios en un sitio Web programado en ASP.NET 1.1 o 2.0 y mediante C#.

Cabe destacar que vamos a presentar dos tipos de roles, Administrador y Usuario. Los usuarios que se autentifiquen correctamente, recibirán un rol, y en función de ese rol, podrán acceder a unos directorios u otros del sitio Web.

Tenemos que comenzar preparando nuestro fichero web.config de la siguiente manera:

<system.web>
   <customErrors mode="Off"/>
   <authentication mode="Forms">
      <forms name=".ASPXFORMSDEMO" loginUrl="login.aspx" protection="All" path="/" timeout="30"/>
      <passport redirectUrl="internal"/>
   </authentication>
   <compilation debug="true"/>
   <authorization>
      <allow users="*"/>
   </authorization>
</system.web>
<location path="administracion">
   <system.web>
      <authorization>
         <deny users="?"/>
         <deny roles="Usuario"/>
         <allow roles="Administrador"/>
      </authorization>
   </system.web>
</location>
<location path="privado">
   <system.web>
      <authorization>
         <deny users="?"/>
         <allow roles="Usuario"/>
      </authorization>
   </system.web>
</location>

Se crean dos roles, Usuario y Administrador. Cada uno de ellos tendrá permisos en el directorio privado y en el directorio administracion respectivamente.

Ahora lo que tienemos que trabajar la autentificacion, que en este caso la vamos a hacer mediante una cookie.

Básicamente lo que hay que hacer es que cuando un usuario se intenta autentificar, hay que asignarle por código (c# o vb.net) qué rol le pertenece. Posteriormente el sistema se ocupará, según lo definido en webconfig de permitirle "quedarse en el directorio" o redireccionarle a la página que ponemos más arriba, en la parte del web.config.

El comportamiento del tipico botón Entrar de un sitio web podría ser el siguiente:

if (el usuario se ha autentificado correctamente en la web)
{
   FormsAuthenticationTicket tkt;
   String cook, sNombre;
   HttpCookie ck;
   sNombre = usuario;
   tkt = new FormsAuthenticationTicket(1, sNombre, DateTime.Now, DateTime.Now.AddMinutes(30), false, i + "");
   cook = FormsAuthentication.Encrypt(tkt);
   ck = new HttpCookie(FormsAuthentication.FormsCookieName, cook);
   Page.Response.Cookies.Add(ck);
}

En éste código básicamente se ha creado la cookie y en el momento de añadirla, se dispara el evento de autentificación que comentamos más abajo.

Como nota aclaratoria, la variable i almacena un 1 ó un 2 si el usuario (segun nos haya dicho la base de datos al confrontarlo con la user/pass) administrador o usuario normal respectivamente.

Ahora tenemos que añadir al sitio web un componente del tipo Global.asax
y dentro de él programar el siguiente evento: Application_AuthenticateRequest con un código similar a éste:

if (!(HttpContext.Current.User == null))
{
   if (HttpContext.Current.User.Identity.AuthenticationType == "Forms")
   {
      FormsAuthenticationTicket tkt;
      tkt = FormsAuthentication.Decrypt(Request.Cookies[FormsAuthentication.FormsCookieName].Value);
      String[] usuarios ={ "" };
      if (Convert.ToInt32(tkt.UserData) == 1)
      {
         //usuario administrador
         usuarios[0] = "Administrador";
      }
      else
      {
         if (Convert.ToInt32(tkt.UserData) == 2)
         {
            //usuario normal
            usuarios[0] = "Usuario";
         }
         else
         {
            //usuario mal autenticado
            Response.Redirect("http://www.tuweb.com/login.aspx");
         }
      }
      //En este momento asignamos el rol que le ha correspondido
      System.Web.Security.FormsIdentity id;
      id = (System.Web.Security.FormsIdentity)HttpContext.Current.User.Identity;
      HttpContext.Current.User = new System.Security.Principal.GenericPrincipal(id, usuarios);
   }
}

Este evento es el que se dispara cuando un usuario pretende autentificarse. Entonces es en este punto donde se le asigna (en función de su user/password) qué rol tiene el usuario.

En éste artículo he contado con la colaboración de mi compañero de carrera www.jlrodriguez.net