none
Como hacer para verificar intentos fallidos al iniciar sesion ASP.NET RRS feed

  • Pregunta

  • Buenas, como podria hacer para verificar los intentos fallidos de un usuario al iniciar sesion, pero que cuando sean 3 intentos fallidos, el usuario se bloquee, pero esto lo debo hacer sin base de datos, tiene que ser a codigo
    sábado, 10 de septiembre de 2016 17:39

Respuestas

  • Hola, Alberto Poblacion, gracias por la ayuda, pos yo abia probado de la siguiente forma pero no me sirvio

                intentos = intentos + 1;
    [...]
    No, eso no sirve. Si "intentos" es una variable local, se pierde a cada postback (porque se destruye la clase que la contiene), luego siempre vuelve a cero. Y si lo salvas en una variable global, se comparte para todos los usuarios, por lo que los intentos fallidos de uno afectan a los demás. Tienes que asociar la variable con el usuario. Y para eso, hay que salvarla en el sitio donde estés salvando el usuario (que no nos has dicho donde es, solo nos dices que no es una base de datos, pero no nos has explicado dónde estás salvando los usuarios, que sería el sitio lógico para salvar también los intentos de cada uno).
    sábado, 10 de septiembre de 2016 20:04
  • hola

    sino puedes bloquear al usuario utilizando una base de datos entonces solo bloqueareas intentos en esa sesion en particular, salvo que lleves una lista en una variable definida como "static"

    private static Dictionary<string, int> Intentos;
    
    public void frmlogin_Load(...)
    {
    	if(!IsPostBack){
    		if(Intentos == null){
    			Intentos = new Dictionary<string, int>();
    		}
    	}
    }
    
    private void button1_Click(object sender, EventArgs e)
    {
    
    	if(Intentos.ContainsKey(txtUsuario.Text) 
    		&& Intentos[txtUsuario.Text] > 3)
    	{
    		//se redirecciona a la pagina de error
    	}
    		
    		
    	if (aquipones tu condicion de intento correcto)
    	{ 
    		//login correcto
                    Intentos[txtUsuario.Text] = 0;
    	}
    	else
    	{
    		if(!Intentos.ContainsKey(txtUsuario.Text))
    			Intentos.Add(txtUsuario.Text, 1);
    		else
    			Intentos[txtUsuario.Text] ++;
    			
    		if(Intentos[txtUsuario.Text] > 3)
    		{
    			//se redirecciona a la pagina de error
    		}
    	}
    } 

    el static actua como el objeto Application, entonces cuando el usuario cierra el browser no se pierde los datos ya que quedan a nivel del sitio conservando la lista de usuario

    no puedes usar una variable simple porque pierdes el dato en cada postback, tampoco el objeto Session porque pierdes el dato si se cierra el browser

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    lunes, 12 de septiembre de 2016 10:12

Todas las respuestas

  • Guarda los intentos en el mismo sitio en el que tengas guardados los usuarios (que como bien dices, podría no ser una base de datos). Donde tengas los usuarios, añade un campo más a tu almacenamiento de usuarios que sea el número de intentos fallidos. Cada vez que el usuario meta mal la password, incrementas ese campo, y cuando acceda con éxito, lo devuelves a cero.
    sábado, 10 de septiembre de 2016 17:52
  • Hola, Alberto Poblacion, gracias por la ayuda, pos yo abia probado de la siguiente forma pero no me sirvio

    lbl_mensaje.Text = "Contraseña o usuario incorrecto";
                intentos = intentos + 1;

                if (intentos == 3)
                {
                    lbl_mensaje.Text = "Haz ingresado tus datos erroneamente 3 veces";
                }


    sábado, 10 de septiembre de 2016 18:06
  • Pienso que podrías comparar el nombre de usuario que se ingresa. Ejemplo "Juan" cada ves que se intente ingresar insertas un intento a una lista, después cuentas y si son mas de tres lo bloqueas de la BD, le pides que espere un tiempo, etc.

            private void button1_Click(object sender, EventArgs e)
            {
                if (aquipones tu condicion de intento correcto)
                { 
                    //y aqui que pasaria si el usuario y contraseña son corrrectos. Importante limpiar la lista aqui

                }
                else
                {
                    Intentos.Add(txtUsuario.Text);
                    if(Intentos.Count > 3)
                    {
                        //Aqui pones lo que pasaria si el usuario intennta ingresar mas de 3 veses al sistema
                        //Lo bloqueas, le pides que espere un tiempo, etc
                    }
                }
            }


    • Editado Charlee96 sábado, 10 de septiembre de 2016 18:10
    sábado, 10 de septiembre de 2016 18:08
  • Hola, Charlee96, la cuestion es que el boqueo lo tengo que hacer sin base de datos
    • Editado padermo sábado, 10 de septiembre de 2016 18:39
    sábado, 10 de septiembre de 2016 18:39
  • Hola, Alberto Poblacion, gracias por la ayuda, pos yo abia probado de la siguiente forma pero no me sirvio

                intentos = intentos + 1;
    [...]
    No, eso no sirve. Si "intentos" es una variable local, se pierde a cada postback (porque se destruye la clase que la contiene), luego siempre vuelve a cero. Y si lo salvas en una variable global, se comparte para todos los usuarios, por lo que los intentos fallidos de uno afectan a los demás. Tienes que asociar la variable con el usuario. Y para eso, hay que salvarla en el sitio donde estés salvando el usuario (que no nos has dicho donde es, solo nos dices que no es una base de datos, pero no nos has explicado dónde estás salvando los usuarios, que sería el sitio lógico para salvar también los intentos de cada uno).
    sábado, 10 de septiembre de 2016 20:04
  • hola

    sino puedes bloquear al usuario utilizando una base de datos entonces solo bloqueareas intentos en esa sesion en particular, salvo que lleves una lista en una variable definida como "static"

    private static Dictionary<string, int> Intentos;
    
    public void frmlogin_Load(...)
    {
    	if(!IsPostBack){
    		if(Intentos == null){
    			Intentos = new Dictionary<string, int>();
    		}
    	}
    }
    
    private void button1_Click(object sender, EventArgs e)
    {
    
    	if(Intentos.ContainsKey(txtUsuario.Text) 
    		&& Intentos[txtUsuario.Text] > 3)
    	{
    		//se redirecciona a la pagina de error
    	}
    		
    		
    	if (aquipones tu condicion de intento correcto)
    	{ 
    		//login correcto
                    Intentos[txtUsuario.Text] = 0;
    	}
    	else
    	{
    		if(!Intentos.ContainsKey(txtUsuario.Text))
    			Intentos.Add(txtUsuario.Text, 1);
    		else
    			Intentos[txtUsuario.Text] ++;
    			
    		if(Intentos[txtUsuario.Text] > 3)
    		{
    			//se redirecciona a la pagina de error
    		}
    	}
    } 

    el static actua como el objeto Application, entonces cuando el usuario cierra el browser no se pierde los datos ya que quedan a nivel del sitio conservando la lista de usuario

    no puedes usar una variable simple porque pierdes el dato en cada postback, tampoco el objeto Session porque pierdes el dato si se cierra el browser

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    lunes, 12 de septiembre de 2016 10:12