Manejar en código el login y registro de un usuario

Gracias a los controles CreateUserWizard y Login de ASP.NET 2.0, crear un usuario y/o ingresarlo en el sistema es tremendamente fácil. Sin embargo, estos controles, al tener una naturaleza tan sencilla, consiguen -por defecto- unos resultados igualmente sencillos.

Aumentar sus capacidades no supone otra cosa que manejar algunos de sus eventos, crear nuevos pasos o personalizar sus templates.

Sin embargo este no es el objetivo de este artículo, lo que nosotros vamos a ver es cómo podemos manejar con nuestro propio código el registro de un usuario así como su ingreso en el sistema.


Registro de un usuario
Y como más vale un ejemplo que mil palabras, ahí va nuestro código para registrar un usuario (recordad importar el namespace "System.Web.Security"):

    protected void registrar(string usuario, string password, string email, string pregunta, string respuesta)
    {
        MembershipCreateStatus status;

      // Tratamos de crear el usuario
        Membership.CreateUser(usuario, password, email, pregunta, respuesta, true, out status);

      // Comprobamos el estado de la creación del usuario
        if (status == MembershipCreateStatus.Success)
        {
            Roles.AddUserToRole(usuario, "Usuario");
        // Podemos realizar otras acciones como sumar una visita, etc.

// Ingresamos el usuario: nuestra próxima función
ingresar(usuario, password, true);
        }
        else
        {
        // Si no se ha podido crear el usuario,
        // Manejemos cuál ha sido el motivo
            switch (status)
            {
                case MembershipCreateStatus.DuplicateUserName:
                    lb_Error.Text = "Hay otro usuarios con el mismo nombre";
                    break;
                default:
                    lb_Error.Text = "Ha habido un error de registro: " + status.ToString();
                    break;
            }
            lb_Error.Visible = true;
        }
    }



El punto clave aquí es el "Membership.CreateUser(...)", donde le pasamos nombre, contraseña y demás información, recogiendo el estado del registro de usuario en nuestra variable "status", un enumerador del tipo "MembershipCreateStatus".

Teniendo la variable "status" podemos manejar cualquier cosa que haya salido mal. Nosotros nos limitamos mostrar un mensaje personalizado si hay otro usuario con el mismo nombre y un mensaje generalizado para cualquier otro tipo de error.

Como vemos, si el registro del usuario ha sido satisfactorio, hemos decidido añadir el usuario al Rol "Usuario" (que se supone un Rol ya creado) y posteriormente ingresarlo automáticamente en el sistema (función que explicaremos a continuación). Pero nosotros podemos hacer lo que queramos, dependiendo de cómo tengamos preparada nuestra aplicación: podemos sumar una visita en nuestro sistema o cualquier otra cosa que se nos ocurra.


Ingreso de un usuario
Ingresar a un usuario es, cuanto menos, tan sencillo como registrarlo, veamos el código comentado y posteriormente lo estudiaremos:

    protected void ingresar(string usuario, string password, bool recuerdame)
    {
        // Tratamos de validar al usuario
        if (Membership.ValidateUser(usuario, password))
        {
            // La variable recuerdame indica si queremos que el usuario
            // Entre automáticamente al sistema la próxima vez
            FormsAuthentication.SetAuthCookie(usuario, recuerdame);

            // Ahora el usuario ya está validado y debemos decidir donde
            // redirigirlo. Habitualmente, si la url tiene el querystring "returnUrl"
            // le devolvemos allí, y si no podemos decidir si enviar al usuario
            // al nuestra página principal, a la misma página en que está o donde queramos.
            if (Request.QueryString["returnUrl"] != null)
            {
                Response.Redirect(HttpUtility.UrlEncode(Request.QueryString["returnUrl"]));
            }
            else
            {
                Response.Redirect("~/");
                //Response.Redirect(Request.Url.AbsoluteUri);
            }
        }
        else
        {
            // La validación no ha podido llevarse a cabo!!
            // Probemos si es debido a que el usuario existe pero está desactivado
            // O el usuario directamente no existe (podríamos mejorar estas comprobaciones)
            if ((Membership.GetUser(usuario) != null) && (Membership.GetUser(usuario).IsLockedOut))
            {
                lb_Error.Text = "Tu cuenta de usuario ha sido bloqueada";
            }
            else
            {
                lb_Error.Text = "Fallo en tu nombre de usuario o contraseña";
            }
            lb_Error.Visible = true;
        }
    }


Como podemos observar, la clave aquí está en "Membership.ValidateUser(usuario, password)", que trata de validar al usuario y nos devuelve un booleano mostrando el éxito o no de la validación/ingreso del usuario en el sistema.

Si lo ha validado correctamente, actuamos en consecuencia: decidimos si marcar una cookie para recordar al usuario en nuevas visitas y posteriormente mandamos lo mandamos a la Url que decidamos.

Si no ha sido validado, mostramos en nuestra Label (que se supone creada en nuestro ".aspx" o ".ascx") un mensaje indicando el problema que ha habido.


Conclusión
Sí, los controles CreateUserWizard y Login son muy sencillos de usar y muy potentes si usamos todas sus funcionalidades (eventos, templates, personalización)... pero ahora ya podemos crear una ligera secuela de estos nosotros mismo, comprobando que no tienen ningún secreto.