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:
<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:
{
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.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