0

hola a todos estoy creando un sistema en mvc asp.net c# en el cual la contraseña debe ser encriptada para que en la base de datos no se muestre como tal la contraseña la base de datos que ando usando es sql server, pero ya hice la parte de encriptación y cuando creo un nuevo usuario y le doy su contraseña en la base de datos ya me encripta esa contraseña, pero al momento de iniciar sesión me arroja un error de que 'Referencia a objeto no establecida como instancia de un objeto.' user fue full y esto es lo que llevo al momento:

este es el login que estoy haciendo

[HttpPost]

          public ActionResult Login(string usuario, string contraseña)
            {
            if (!string.IsNullOrEmpty(usuario) && !string.IsNullOrEmpty(contraseña))
            {
                ReportesContex db = new ReportesContex();
                var user = db.Usuarios.FirstOrDefault(e => e.numeroUsuario == usuario && e.contraseña == contraseña);
            
                    if (user.rol == "admin") { 
                    
                        FormsAuthentication.SetAuthCookie(user.rol, true);
                        Session["nombre"] = user.nombre;
                        Session["apellidos"] = user.apellidos;
                        return RedirectToAction("IndexAdmin", "Home");

                    }else

                if (user.rol == "superAdmin")
                {

                    FormsAuthentication.SetAuthCookie(user.rol, true);
                    Session["nombre"] = user.nombre;
                    Session["apellidos"] = user.apellidos;
                    return RedirectToAction("IndexSuperAdmin", "Home");
                
                }
                else

                if (user.rol == "user")
                {

                    FormsAuthentication.SetAuthCookie(user.rol, true);
                    Session["nombre"] = user.nombre;
                    Session["apellidos"] = user.apellidos;
                    return RedirectToAction("IndexUser", "Home");
                }
                else

                if (user.rol == "controller")
                {

                    FormsAuthentication.SetAuthCookie(user.rol, true);
                    Session["nombre"] = user.nombre;
                    Session["apellidos"] = user.apellidos;
                    return RedirectToAction("IndexController", "Home");
                }

                else
                {
                        return RedirectToAction("Login", new { message = "No reconocemos tus datos" });

                    }
                }
         
            else
            {
                return RedirectToAction("Login", new { message = "Llena todos los campos para poder iniciar secion" });

            }
            }

y esto es lo que tengo en la encriptacion

 public static string GetSHA256(string str)
        {
            SHA256 sha256 = SHA256Managed.Create();
            ASCIIEncoding encoding = new ASCIIEncoding();
            byte[] stream = null;
            StringBuilder sb = new StringBuilder();
            stream = sha256.ComputeHash(encoding.GetBytes(str));
            for (int i = 0; i < stream.Length; i++) sb.AppendFormat("{0:x2}", stream[i]);
            return sb.ToString();
        }

introducir la descripción de la imagen aquí

  • Para aclarar, no estas encriptando la contraseña, estas hasheandola. Y como en la base de datos me imagino guardas el hash de la contraseña al momento de registrar un usuario, entonces al loguearte deberías igual hashear la contraseña y comparar los hashes. – JhonRM Mar 17 '21 at 23:37
  • Básicamente, cualquiera de esos usos de instancias que estás haciendo y suponiendo que se instanciaron correctamente, en realidad no representa una instancia (posiblemente apunte a null). Por ejemplo, instanciar `db` puede estar fallando y no estás capturando la excepción – Alfabravo Mar 17 '21 at 23:37
  • @JhonRM pues, si estamos en esas, no está hasheando sino que está generando un hash :P – Alfabravo Mar 17 '21 at 23:38
  • 1
    Por cierto, solo iba a mencionar que NET Core provee un mecanismo para el tema de manejo de usuarios conocido como IdentityUser que hace todo esto por uno. – JhonRM Mar 17 '21 at 23:38
  • @Alfabravo No se como decirlo en español :P – JhonRM Mar 17 '21 at 23:39
  • entonces que me recomiendan hacer para poder arreglar ese problema? – Fatima Jimenez Sandoval Mar 17 '21 at 23:39
  • @FatimaJimenezSandoval depende, esto es para aprender o es para una aplicación que va a estar en producción? – JhonRM Mar 17 '21 at 23:41
  • es para aprender, esque estoy empezando a utilizar encriptacion solo que me estoy confundiendo un poco en esta parte – Fatima Jimenez Sandoval Mar 17 '21 at 23:42
  • Yo comenzaría por hacer un try-catch y capturaría la excepción para saber cuál es la referencia que no se esta inicializando. Y editaría la pregunta poniendo el mensaje completo de error :) – Alfabravo Mar 17 '21 at 23:44
  • okey entonces deje pruebo lo de try catch – Fatima Jimenez Sandoval Mar 17 '21 at 23:51
  • 1
    @Alfabravo te apuesto que es user nulo, ya que al buscar en el FirstOrDefault no esta pasando la contraseña encriptada (haseheada)... esta pasando la contra en plano y por eso no encuentra nada. – gbianchi Mar 18 '21 at 00:01
  • 1
    @FatimaJimenezSandoval cierro tu pregunta por duplicada. Tenes que buscar cual es el objeto que es nulo, y verificar porque, y de ahi, si quedan dudas, hacer la pregunta por ese motivo. Este motivo de duda ya esta bien documentado – gbianchi Mar 18 '21 at 00:02

0 Answers0