Autenticación Basada en Formularios
Fecha: 13/Dic/2004 (12/12/2004)
|
En este articulo vamos a crear y configurar el acceso a un directorio privado con identificación de usuario en un usuario Web.
Si nuestro Web Server es IIS, es posible usar la autenticación integrada en Windows, pero ¿qué podemos hacer si no tenemos acceso al Web Server y necesitemos restringir el control a uno de los directorios de nuestro site? En este caso lo que tendremos que hacer es gestionar el acceso mediante formularios.
Este tipo de autenticación se basa en que, en el proceso de logado se genera un ticket de acceso al site. Este ticket de acceso se almacenará en una cookie del navegador, siendo necesaria su presencia para poder acceder a los directorios que nosotros definamos como privados.
Pasos a seguir.
Para poder activar la seguridad basada en formularios hemos de seguir los siguientes pasos:
Para empezar, vamos a crear un directorio denominado PRIVADO dentro de nuestro website, en el que crearemos una página que nos muestre (¡qué original!) un “HOLA MUNDO PRIVADO” que nos permitirá validar que todo funcione correctamente.
- Configurar el modo de autenticación modificando la sección “authentication” en el fichero web.config de la aplicación.
- Denegar a los usuarios anónimos a los usuarios anónimos en los directorios privados de nuestro site.
- Crear una página de registro.
Modificando el web.config.
Tenemos un directorio donde colgaremos, por ejemplo, las herramientas administrativas de nuestro site. Para hacer que este directorio sea realmente privado hemos de modificar el fichero web.config , localizado en el directorio raíz de la aplicación.
Como ya sabemos, este archivo es un documento xml. Dentro de la etiqueta system.web tenemos, entre otras, las dos entradas que hemos de modificar para configurar el acceso, estas dos entradas tienen las etiquetas authentication y authorization.<?xml version="1.0" encoding="utf-8" ?> <configuration> <system.web> ... <authentication mode="Forms"> <forms name="myforms.myauth" loginUrl="login.aspx" protection="All" timeout="10" path="/"> <credentials passwordFormat="Clear"> <user name="admin" password="admin"/> </credentials> </forms> </authentication> ... </system.web> </configuration>Lo primero que hemos de hacer es fijar el atributo mode=”Forms” del elemento authentication
<authentication mode=”Forms”>
Esto indicará al Web Server que vamos a gestionar la autenticación de los usuarios mediante formularios.
El elemento forms es el que define el comportamiento de nuestro sistema de autenticación. Los atributos de este elemento son los siguientes:
El elemento credentials nos servirá para configurar los usuarios que tendrán acceso a nuestro directorio privado. Para cada usuario hemos de crear un elemento <user> indicando el login y el password.
- name. El nombre de la cookie del navegador que almacena el ticket de acceso. Si no se especifica uno se llamará ASPXAUTH. Por temas de seguridad usaremos un nombre distinto del por defecto.
- loginUrl. La pagina a la que se enviará a los usuarios no logados de modo automático. Si no se especifica ninguna, se nos enviará a la página login.aspx situada en el directorio raíz de la aplicación Web.
- timeout. Minutos en los que la cookie tiene validez. Por defecto es de 30 minutos.
- protection. Especifica la forma en la que se protegen los datos de la cookie. Los valores son All, None, Encryption y Validation, siendo All el valor por defecto. Conviene indicar que, a menos que se indique lo contrario, las cookies se encriptan usando los algoritmos DES o TripleDES, dependiendo del servidor.
Si quisiéramos encriptar los passwords, hemos de cambiar el atributo passwordFormat del elemento credentials y fijarlo a los valores SHA1 o MD5, dependiendo de cual de los dos algoritmos de cifrado queramos usar.
Configurando el directorio privado.
Ya tenemos configurado el entorno de autenticación. Ahora toca configurar nuestro directorio privado para que evitar accesos no deseados.
En primer lugar hemos de modificar o crear un archivo web.config dentro del directorio privado. En este archivo hemos de configurar el elemento authorization.
<?xml version="1.0" encoding="utf-8" ?> <configuration> <system.web> <authorization> <deny users="?" /> <!-- Permitir a todos los usuarios --> </authorization> </system.web> </configuration>Dentro de la sección authorization podemos tener los siguientes elementos
En ambos elementos tenemos el atributo users donde podemos especificar
- allow para permitir el acceso a los usuarios.
- deny para denegar usuarios.
- “?” para indicar todos los usuarios anónimos
- “*” para indicar a todos los usuarios, tanto anónimos como autenticados.
- Lista de usuarios separada por coma, para indicar a un grupo de usuarios a los que queramos dar o denegar acceso, según el elemento en el que se encuentre.
La página de login.
Con todo lo que hemos hecho hasta ahora, ya tenemos configurado un directorio de acceso privado en nuestro website. Sin embargo, nos falta una página de logado para poder acceder a la página HOLA MUNDO PRIVADO.
Nuestra página tendrá
- dos cajas de texto, una para el usuario y otra para la password
- un botón etiquetado como "login"
- un checkbox que nos permitirá almacenar el password.
La definición de esta página queda al gusto del lector. Teneis un ejemplo en las fuentes que acompañan a este articulo. Lo unico es recordar que la caja de texto que usamos para el password ha de tener la propiedad textmode="password" para que nos oculte el valor del password.
Una vez el usuario introduce su nombre y su password se ejecuta el siguente código.
Private Sub cmdLogin_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles cmdLogin.Click 'Validacion Usuarios. Esto tira del fichero de configuración If System.Web.Security.FormsAuthentication.Authenticate(txtUsuario.Text, txtPassword.Text) Then 'ok. generamos un tiquet y redirigimos a la página de inicio System.Web.Security.FormsAuthentication.RedirectFromLoginPage(txtUsuario.Text, False) Else 'la cosa no ha ido bien lblError.Visible = True lblError.Text = "Usuario No Valido" End If End SubEste código contiene el meollo del asunto. El método Autenticate de System.Web.Security.FormsAuthentication localiza en el fichero web.config el usuario y password introducidos son configurados, devolviendo true si encuentra el par o false en caso contrario.
En caso de que la entrada sea errónea se muestra un mensaje al usuario.
Si el usuario y passoword son correctos, ejecutamos el método RedirectFromLoginPage, que nos genera un ticket de acceso y nos envía a la página privada a la que queríamos acceder y que nos ha obligado a hacer el login. El segundo parámetro de este método indica si queremos hacer una cookie permanente o temporal. En el primer caso, no será necesario que volvamos a introducir el usuario y password para acceder a la página Web.
Otra opción que tenemos es la de generar el ticket sin redirección automática. De este modo podemos controlar el destino tras un login, de modo que los usuarios, una vez logados, vayan a una página de inicio concreto. Para hacer esto hemos de usar en lugar del método RedirectFromLoginPage, el método System.Web.Security.FormsAuthentication.SetAuthCookie (UserName, Persist) , quedando a nuestro criterio la redirección de la siguente página que se debe visualizar.
Notas finales.
En el ejemplo que hemos estado viendo tenemos los usuarios están definidos en el fichero web.config. Esto esta bien si tenemos un numero fijo de usuarios, que no pueden cambiar su password. También es útil para caso de pocos usuarios. En condiciones normales lo que vamos a tener es una base de datos que contiene una tabla con los usuarios de nuestro site. Para poder acceder a ellos hemos de sustituir la llamada la método Autenticate por una llamada a un método propio que verifique en nuestra base de datos si el usuario y password son validos o no. Esto os queda como deberes.
Otra cosa que hemos de añadir a nuestro site es la posibilidad de desconectarnos. Para ello usamos el método System.Web.Security.FormsAuthentication.SignOut () que permite que el usuario finalice su sesión.
Ahora ya solo queda que verifiqueis que todo funciona correctamente.
Fichero con el código de ejemplo: lfoixench_AutenticacionUsandoFormularios.zip - 4 KB