none
Validar Usuario(String) y Password(varbinary(MAX)) RRS feed

  • Pregunta

  • Hola Amigos,

    Estoy tratando de realizar lo siguiente Tengo un sistema web en MVC5 C# y estoy en el login donde tengo que validar al usuario y la clave.

    Tengo una tabla en SQLSERVER usuario con los campos 

    Usuario(String)

    Password(varbinary(MAX))

    Estoy usando EntityFramework, como debería de validar al usuario y calve?

    Este código no me funciona pero si cambio a String ambos campos en el SQLSERVER si lo realiza correctamente.

    Gracias por sus respuestas.

            public bool Logeo(ParUsuario usuario)
            {
    
                var  validar = db.ParUsuario.Where(p => p.usuariocorto == usuario.usuariocorto && p.usuarioclave==usuario.usuarioclave);
    
                return (validar != null);
            }



    Conocuica

    miércoles, 17 de octubre de 2018 6:43

Todas las respuestas

  • Hola Amigos,

    Googleando trate de usar un store procedure cuando lo ejecuto por SQLSERVER me funciona bien pero por C# no funciona en todos los casos me devuelve -1 y debería ser 1.

    Ambos campos lo mando como cadena, que puede estar pasando?

            public virtual int spusuariologeo(string usuariocorto, string usuarioclave)
            {
                var usuariocortoParameter = usuariocorto != null ?
                    new ObjectParameter("usuariocorto", usuariocorto) :
                    new ObjectParameter("usuariocorto", typeof(string));
        
                var usuarioclaveParameter = usuarioclave != null ?
                    new ObjectParameter("usuarioclave", usuarioclave) :
                    new ObjectParameter("usuarioclave", typeof(string));
        
                return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("spusuariologeo", usuariocortoParameter, usuarioclaveParameter);
            }


    Conocuica

    miércoles, 17 de octubre de 2018 7:44
  • En toería debería funcionar. Para tratar de depurarlo, sugiero hacer una captura con el Profiler en SQL Server y examinar la sentencia que en realidad está enviándole EF, a ver si se nota algo que nos dé una pista acerca de cuál puede ser el problema (por ejemplo, distintos bytes en el hexadecimal del parámetro, que indicaría que el formato binario almacenado no concuerda con el que se envía a comparar).

    Otra alternativa que te propongo es reescribir la sentencia para que solo compare el usuariocorto y devuelva el usuarioclave, y debajo comparar el valor de usuarioclave usando código cliente en C#. Tiene la ventaja de que si no funciona puedes parar la ejecución en ese punto con el debugger y examinar qué es lo que realmente te está llegando y ver en qué difiere respecto a lo que intentabas comparar.

    miércoles, 17 de octubre de 2018 7:46
  • Hola,

    Lo revise con un tracer y esta bien la llamada.

    Algún Ejemplo por favor.

    ====== El el Interface ======
    
        int Logeo(ParUsuario usuario);
    
    
    ====== En la capa DAO ====== 
    
            public int Logeo(ParUsuario usuarios)
            {
    
                var usuario = db.spusuariologeo(usuarios.usuariocorto, usuarios.clave);
    
                return usuario;
            }
    
    ====== En la capa de Negocios ====== 
    
    
    
            public int Logeo(ParUsuario usuario)
            {
                using (UsuarioDAO db = new UsuarioDAO())
                {
    
                    return db.Logeo(usuario);
                }
            }
    
    ====== En el controlador ====== 
    
    public ActionResult VerificarAcceso(ParUsuario model, string returnUrl)
    
            {
                try
                {
    
                    UsuarioBL negUsuario = new UsuarioBL();
    
                    int retorno = negUsuario.Logeo(model);
    
                    if (retorno == 1)
                    {
                        ParUsuario u = negUsuario.Buscar(model.usuariocorto);
                        Session["usuario"] = u;
    
                        return RedirectToAction("index", "Home");
                    }
    
                    else
                    {
                        return RedirectToAction("Login", "Inicio", new { mensaje = "Ingrese los datos correctos", identificador = 1 });
                    }
    
                }
                catch (ApplicationException x)
                {
    
                    ViewBag.mensaje = x.Message;
                    return RedirectToAction("Login", "Inicio", new { mensaje = x.Message, identificador = 1 });
                }
            }


    Conocuica

    miércoles, 17 de octubre de 2018 12:21
  • Algo no cuadra. Segun esa captura, se esta realizando una llamada a un procedimiento almacenado, que no concuerda con la consulta de Entity Framework de la que hablabamos al principio. Las sugerencias que yo hacia servian para capturar y comparar los valores enviados con esa tecnica. Si lo cambias por un procedimiento almacenado, no valen para nada porque seguimos sin ver los valores que se pasan y como difieren de los valores almacenados en la base de datos. Recuerda que las conversiones implicitas de nvarchar a varbinary no son triviales ni evidentes, por lo que no queda claro que la clave que pasas como string se convierta al mismo valor varbinary que hay en la tabla que presuntamente comparas desde el procedimiento almacenado. Nada de eso se ve ni se puede depurar con la traza que aportas ni con la lamada del Profiler.
    miércoles, 17 de octubre de 2018 15:03
  • Hola Alberto,

    Busque y busque y lo pude solucionar de la siguiente manera con este ejemplo.

    https://www.c-sharpcorner.com/article/using-stored-procedure-in-entity-framework-mvc/

    Solo reemplace los valores por los míos. El problema se presentaba porque no devolvía un result como indica en la documentación. 

    Gracias.


    Conocuica

    miércoles, 17 de octubre de 2018 16:15