Validacion de usuario en un web service con C#

Estándar

Enhorabuena, si estas en este blog es que tienes que programar un web service con validación de usuario.

En primer lugar te recomendamos que si, tu aplicación, requiere control de login porque usa datos privados, utilices tambien un certificado SSL a través de https, ya que todo el tráfico entre el web service y tu aplicación estara cifrado, sobre todo, el propio envío de login.

Ahora vamos al tema en cuestión, para hacer mas seguro el consumo del web service utilizaremos el concepto de token al validar usuarioy password. Un token no es mas que un string generado de forma automatica al validar el usuario y la password y que tiene un periodo de caducidad para evitar dejar abiertos los métodos de datos del web service, este token lo enviamos en todos los metodos de datos para validar que la sesión no haya caducado o dejado abierta sin querer.

 En nuestro caso, generaremos el token desde una base de datos SQL Server usando una tabla con dos campos: token y fecha_registro. El campo token debe ser del tipo uniqueidentifier y el de fecha_registro smalldatetime. El valor predeterminado para el campo token sera newid(), lo que nos generara un string unico y con el campo de fecha controlaremos la caducidad segun el tiempo que queramos , por ejemplo con un procedimiento almacenado, que elimine el token caducado cada 30 minutos.

Para generar el token creamos un metodo llamado conectar(), que recibirá un usuario y una password.
Si el usuarioy la password son correctas  llamamos a un procedimiento SQL que genera un nuevo registro en la tabla de tokens , este string lo devolveremos al metodo . Si el usuario no es correcto podemos devolver un código para saber porque falla.

[WebMethod(Description = “Valida conexion.”)]
    public string conectar(string usuario, string password)
    {
        string token;
        token = “”;
        if (usuario == “User” && password == “00009999”)
        {
            string sql;

            sql = “EXEC GENERA_TOKEN ‘” + usuario + “‘”;

            SqlDataReader rsX;
            rsX = datos.AbreConsulta(sql);
            while (rsX.Read())
            {
                if (rsX[“token”].ToString()!=””)
                {
                    token = rsX[“token”].ToString();

                }
                else
                {
                    token = “”;
                }

            }
            rsX.Close();

            return token;
        }
        else
        {
            return token;
        }
    }

Siempre es conveniente tener otro metodo para desconectar, que borre el token usado en la sesion:

[WebMethod(Description = “Desconecta.”)]
    public string desconectar(string token)
    {
        string sql;

        sql = “EXEC DESCONECTA_TOKEN ‘” + token + “‘”;

        datos.EjecutaSQL(sql);
   
        return “OK”;
    }