none
VERIFICAR USUARIO DESDE C# CON SQL

    Question

  • leS comento ...supuestamente en c# esta el metodo void verificar(),lo cual  le ingreso los valores de ("loginusu","password","sw").. los pasos en c# son correctos ,el problema es el codigo en sql en COMO VERIFICA SI EL USUARIO "CON" LA CONTRASEÑA INGRESADA DESDE C# SON correctos,es decir igual al q pertenece en sql...le presento mi avance...
     
    -------------------------------------------------------------------------------
    --VERIFICAR SI EXISTE EL USUARIO
    --------------------------------
    CREATE proc PA_VERIFICARUSUARIO
    @LOGINUSU VARCHAR(50),
    @PASSWORD VARCHAR(100),
    @SW INT OUTPUT
    AS
    BEGIN
    DECLARE @FA AS INT
    DECLARE @DECODIFICADOR VARCHAR
    SET @DECODIFICADOR=ENCRYPBYPASSPHRASE(@LOGINUSU,@PASSWORD)
    --SELECT LOGINUSU= @LOGINUSU,PASSWORD=@DECODIFICADOR FROM USUARIO
    --SET @FA=@@ROWCOUNT
    SELECT LOGINUSU,CLAVE=CONVERT(VARCHAR(300),DECRYPTBYPASSPHRASE(LOGINUSU,PASSWORD)) FROM USUARIO WHERE LOGINUSU='JUAN'

    IF(@FA>0)
     BEGIN
     SET @SW =1
     --USE CLINICARUP
     PRINT 'USUARIO REGSTRADO,USTED PUEDE ACCESAR A LA BASE DE DATOS CLINICARUP'
     END
    ELSE
     BEGIN
     SET @SW=0
     PRINT 'USUARIO INCORRECTO,NO PUEDE ACCEDER A LA BASE DE DATOS CLINICARUP'
     END
    END
    EXEC PA_VERIFICARUSUARIO 'JUAN','123',-1
    SELECT LOGINUSU='JUAN',PASSWORD=CONVERT(VARCHAR(100), ENCRYPTBYPASSPHRASE('JUAN','123')) FROM USUARIO
    ---------------------------------------------------------------------------
    ---------------------------------------------------------------------------

    LA DUDA ES Q ESTOI Q TRATO DE CREAR UN PROCEDIMIENTO ALMACENADO EN SQL PARA Q PUEDA VERIFICAR SI ES Q EL USUARIO Y LA CONTRASEÑA INGRESADAS EN EL FOMRULARIO SEA IGUAL AL DE Q ESTA REGISTRADO EN LA BASE ,PERO PARA ESTO EN SQL LAS CLAVES ESTAN ENCRIPTADAS Y EN EL FOMRULARIO ESTAN NORMALES ....QUIERO Q EL PROCEDIMIENTO ALAMCENADO O UNA FUNCION ME VERIFIK ESAS COSAS ...SE PODRA?? Y SI ESA ASI COMO??


    LPL
    Saturday, July 04, 2009 12:46 AM

Answers

  • --amigos ..disculpen por la demora ,aqui les pongo el codigo de las funciones y del procedimiento almacenado..
    ALTER FUNCTION [dbo].[fnColocaClave]
    (
        @clave VARCHAR(50)
    )
    RETURNS VARCHAR(300)
    AS
    BEGIN
        DECLARE @pass AS VARCHAR(300)
        SET @pass = ENCRYPTBYPASSPHRASE('lpl',@clave)--dbCurso09 es la llave para cifrar el campo.
        RETURN @pass
    END
    --------------------------------------------------------
    INSERT INTO USUARIO (idusuario,loginusu, password)
    VALUES(3,'LUCHITO123',dbo.fnColocaClave('123'))
    -------------------------------------------------
    SELECT idusuario,loginusu,password
    FROM USUARIO
    --------------------------------------------------------
    --------------------------------------------------------
    --------------------------------------------------------
    ALTER FUNCTION fnLeeClave
    (
        @clave VARCHAR(300)
    )
    RETURNS VARCHAR(50)
    AS
    BEGIN
        DECLARE @pass AS VARCHAR(50)
        --Se descifra el campo aplicandole la misma llave con la que se cifro dbCurso09
        SET @pass = DECRYPTBYPASSPHRASE('lpl',@clave)
        RETURN @pass
    END
    --------------------------------------------------------
    --------------------------------------------------------
    -------------------------------------------------
    --VERIFICAA USUARIO ..USANDO FUNCIONES
    -----------------------------------
    ALTER PROC PRUEBA
    @LOGINUSU VARCHAR(50),
    @PASSWORD VARCHAR(300),
    @SW INT OUTPUT
    AS
    BEGIN
    DECLARE @PONECLAVE VARCHAR(300)
    SET @PONECLAVE=dbo.fnColocaClave(@PASSWORD)
    DECLARE @xclave VARCHAR(300)
    ----la duda es aqui porq quiero autenticar el usuario con su password....lo estuve trabajando asi pero no lo comprueba... 
    ----AQUI ES DONDE ME TIENE Q DECIR SI EL USUARIO EXISTE O NO-- 
    set @xclave = (SELECT password=convert(varchar(300),([dbo].[fnLeeClave](@PONECLAVE))) FROM USUARIO WHERE LOGINUSU=@LOGINUSU )
    IF  @xclave=@PASSWORD
    	BEGIN
    	SET @SW=1
    	PRINT 'EXISTE'
    	END
    ELSE
    	BEGIN
    	SET @SW=0
    	PRINT 'NO EXISTE'
    	END
    END
    ----------
    EXEC PRUEBA 'LUCHITO123','123',1
    --aveces escribo en mayusculas y minusculas espero comprendan.. 
    --ncesito una mano de un usuario o experto por favor...!!!;;
    --todo esta claro antes de la sentencia de verificar("IF @xclave=@PASSWORD") 

    LPL
    Monday, July 06, 2009 1:10 AM
  • Te paso un ejemplo de lo que decia.


    use master
    go
    
    -- Creo una base de datos para la prueba
    Create database Prueba
    go
    use Prueba
    go
    
    -- Creo una tabla de usuarios que no almacena 
    -- la contraseña ni la contraseña cifrada
    -- sino el usuario cifrado con la contraseña como 
    -- clave de cifrado.
    Create table dbo.Usuarios
    (
    	Usuario varchar(100) primary key,
    	HashUsuario varbinary(8000)
    )
    go
    
    -- procedimiento para cifrar y guardar el usuario
    Create procedure dbo.AgregarUsuario
    	@Usuario varchar(100),
    	@Contrasena varchar(100)
    as 
    Insert into Usuarios(Usuario,HashUsuario) 
    values(
    	@Usuario,
    	EncryptByPassPhrase(@Contrasena ,@Usuario ,1)
    )
    GO
    
    -- Agrego un usuario de prueba
    exec dbo.AgregarUsuario 'Mariano', 'PassW0rd';
    go
    
    --Vemos la entrada en la tabla
    Select * from Usuarios;
    go
    
    -- Procediemiento para descifrar y validar
    Create procedure dbo.ValidarUsuario
    	@Usuario varchar(100),
    	@Contrasena varchar(100)
    as 
    if (
    	Select COUNT(*)
    	from	Usuarios 
    	where	Usuario = @Usuario
    	and		cast(DECRYPTBYPASSPHRASE(@Contrasena,HashUsuario,1) as varchar(100)) = @Usuario
    ) > 0
    	print 'Validado'
    else
    	print 'Error en credenciales'
    go
    
    -- Probamos con la clave correcta
    exec dbo.ValidarUsuario 'Mariano', 'PassW0rd';
    
    -- Probamos con la clave incorrecta
    exec dbo.ValidarUsuario 'Mariano', 'otra password';
    go
    
    
    -- Borramos todo
    use master;
    drop database Prueba;
    go
    


    Saludos

    Ing. Jose Mariano Alvarez http://blog.josemarianoalvarez.com/ Microsoft MVP SQLTotal Consulting Mi.Correo.es.j0se.marian0.alvarez@gmail.c0m.Corregirl0 Este mensaje se proporciona tal como es, SIN GARANTIAS de ninguna clase
    Monday, July 06, 2009 2:21 PM

All replies

  • Hola, no entiendo tu pregunta, que problema hay en el SQL? si lo que estas usando es una tecnica de autentificacion propia
    Maxi Accotto Consultoria en SQL Server Buenos Aires - Argentina http://blog.maxiaccotto.com
    Saturday, July 04, 2009 1:27 AM
  • LA DUDA ES Q ESTOI Q TRATO DE CREAR UN PROCEDIMIENTO ALMACENADO EN SQL PARA Q PUEDA VERIFICAR SI ES Q EL USUARIO Y LA CONTRASEÑA INGRESADAS EN EL FOMRULARIO SEA IGUAL AL DE Q ESTA REGISTRADO EN LA BASE ,PERO PARA ESTO EN SQL LAS CLAVES ESTAN ENCRIPTADAS Y EN EL FOMRULARIO ESTAN NORMALES ....QUIERO Q EL PROCEDIMIENTO ALAMCENADO O UNA FUNCION ME VERIFIK ESAS COSAS ...SE PODRA?? Y SI ESA ASI COMO??


    LPL
    Saturday, July 04, 2009 3:54 AM
  • Por favor no escriba todo en MAYUSCULAS, parece que nos está gritando.

    Ahora veamos su problema. Por lo que muestra su código usted tiene una tabla USUARIO donde registra los nombres y passwords de los usuarios de una aplicación. Es decir, usted está autenticando usuarios por su cuenta.

    La forma en la que usted debe decifrar la password deberá ser acorde a la técnica de cifrado que usted usó cuando insertó en USUARIO.

    Cómo hace usted para agregar un usuario? De qué forma usted inserta la password cifrada en la tabla USUARIO?

    Gustavo Larriera, MVP --- Este mensaje se proporciona tal como es, sin garantías de ninguna clase. ---
    Saturday, July 04, 2009 10:24 PM
  • Guardar contraseñas en euna tabla no es adecuado.
    Ademas, si el procedimiento te funcionara,  estas usando el nombre del usario como passphrase.

    Se puede hacer lo que quieres sin guardar las contraseñas.
    Mi sugerencia es la siguiente.

    Deberás guardar en la tabla de usuarios el usuario junto con los datos que quieras, los datos que te permitan autenticar.
    En lugar de guardar la contraseña cifrada, guarda el nombre del usuario cifrado con la contraseña que este tiene (en este caso la contraseña es usada como passphrase).
    Por lo tanto al no estar almacenada la contraseña ni la contraseña cifrada y cada usuario tiene su propia clave de cifrado, que es la contraseña, es altamente improbable que alguien pueda obtener alguna clave.

    Para verificar el usuario debes:
    1- Cifrar el usuario ingresado con la contraseña ingresada
    2- Buscar el registro con el nombre del usuario que si lo tienes
    3- Comparar si la el resultado de cifrar el usuario ingresado con la contraseña ingresada es igual al que esta almacenado en la base de datos. Si son iguales el usuario y la contraseña son correctos..

    Saludos



    Ing. Jose Mariano Alvarez http://blog.josemarianoalvarez.com/ Microsoft MVP SQLTotal Consulting Mi.Correo.es.j0se.marian0.alvarez@gmail.c0m.Corregirl0 Este mensaje se proporciona tal como es, SIN GARANTIAS de ninguna clase
    Sunday, July 05, 2009 3:01 PM
  • --amigos ..disculpen por la demora ,aqui les pongo el codigo de las funciones y del procedimiento almacenado..
    ALTER FUNCTION [dbo].[fnColocaClave]
    (
        @clave VARCHAR(50)
    )
    RETURNS VARCHAR(300)
    AS
    BEGIN
        DECLARE @pass AS VARCHAR(300)
        SET @pass = ENCRYPTBYPASSPHRASE('lpl',@clave)--dbCurso09 es la llave para cifrar el campo.
        RETURN @pass
    END
    --------------------------------------------------------
    INSERT INTO USUARIO (idusuario,loginusu, password)
    VALUES(3,'LUCHITO123',dbo.fnColocaClave('123'))
    -------------------------------------------------
    SELECT idusuario,loginusu,password
    FROM USUARIO
    --------------------------------------------------------
    --------------------------------------------------------
    --------------------------------------------------------
    ALTER FUNCTION fnLeeClave
    (
        @clave VARCHAR(300)
    )
    RETURNS VARCHAR(50)
    AS
    BEGIN
        DECLARE @pass AS VARCHAR(50)
        --Se descifra el campo aplicandole la misma llave con la que se cifro dbCurso09
        SET @pass = DECRYPTBYPASSPHRASE('lpl',@clave)
        RETURN @pass
    END
    --------------------------------------------------------
    --------------------------------------------------------
    -------------------------------------------------
    --VERIFICAA USUARIO ..USANDO FUNCIONES
    -----------------------------------
    ALTER PROC PRUEBA
    @LOGINUSU VARCHAR(50),
    @PASSWORD VARCHAR(300),
    @SW INT OUTPUT
    AS
    BEGIN
    DECLARE @PONECLAVE VARCHAR(300)
    SET @PONECLAVE=dbo.fnColocaClave(@PASSWORD)
    DECLARE @xclave VARCHAR(300)
    ----la duda es aqui porq quiero autenticar el usuario con su password....lo estuve trabajando asi pero no lo comprueba... 
    ----AQUI ES DONDE ME TIENE Q DECIR SI EL USUARIO EXISTE O NO-- 
    set @xclave = (SELECT password=convert(varchar(300),([dbo].[fnLeeClave](@PONECLAVE))) FROM USUARIO WHERE LOGINUSU=@LOGINUSU )
    IF  @xclave=@PASSWORD
    	BEGIN
    	SET @SW=1
    	PRINT 'EXISTE'
    	END
    ELSE
    	BEGIN
    	SET @SW=0
    	PRINT 'NO EXISTE'
    	END
    END
    ----------
    EXEC PRUEBA 'LUCHITO123','123',1
    --aveces escribo en mayusculas y minusculas espero comprendan.. 
    --ncesito una mano de un usuario o experto por favor...!!!;;
    --todo esta claro antes de la sentencia de verificar("IF @xclave=@PASSWORD") 

    LPL
    Monday, July 06, 2009 1:10 AM
  • Te paso un ejemplo de lo que decia.


    use master
    go
    
    -- Creo una base de datos para la prueba
    Create database Prueba
    go
    use Prueba
    go
    
    -- Creo una tabla de usuarios que no almacena 
    -- la contraseña ni la contraseña cifrada
    -- sino el usuario cifrado con la contraseña como 
    -- clave de cifrado.
    Create table dbo.Usuarios
    (
    	Usuario varchar(100) primary key,
    	HashUsuario varbinary(8000)
    )
    go
    
    -- procedimiento para cifrar y guardar el usuario
    Create procedure dbo.AgregarUsuario
    	@Usuario varchar(100),
    	@Contrasena varchar(100)
    as 
    Insert into Usuarios(Usuario,HashUsuario) 
    values(
    	@Usuario,
    	EncryptByPassPhrase(@Contrasena ,@Usuario ,1)
    )
    GO
    
    -- Agrego un usuario de prueba
    exec dbo.AgregarUsuario 'Mariano', 'PassW0rd';
    go
    
    --Vemos la entrada en la tabla
    Select * from Usuarios;
    go
    
    -- Procediemiento para descifrar y validar
    Create procedure dbo.ValidarUsuario
    	@Usuario varchar(100),
    	@Contrasena varchar(100)
    as 
    if (
    	Select COUNT(*)
    	from	Usuarios 
    	where	Usuario = @Usuario
    	and		cast(DECRYPTBYPASSPHRASE(@Contrasena,HashUsuario,1) as varchar(100)) = @Usuario
    ) > 0
    	print 'Validado'
    else
    	print 'Error en credenciales'
    go
    
    -- Probamos con la clave correcta
    exec dbo.ValidarUsuario 'Mariano', 'PassW0rd';
    
    -- Probamos con la clave incorrecta
    exec dbo.ValidarUsuario 'Mariano', 'otra password';
    go
    
    
    -- Borramos todo
    use master;
    drop database Prueba;
    go
    


    Saludos

    Ing. Jose Mariano Alvarez http://blog.josemarianoalvarez.com/ Microsoft MVP SQLTotal Consulting Mi.Correo.es.j0se.marian0.alvarez@gmail.c0m.Corregirl0 Este mensaje se proporciona tal como es, SIN GARANTIAS de ninguna clase
    Monday, July 06, 2009 2:21 PM
  • hola Jose Mariano ,tu propuesta de solucion es buena.. me ayudó bastante.. tu codigo ...gracias..
    saludos .

    LPL
    Tuesday, July 07, 2009 9:45 PM
  • A proposito, escribi este post  en mi blog. Espero les sirva.

    Cómo validar un usuario con funciones de cifrado del SQL Server sin almacenar la contraseña en una tabla

    http://blog.josemarianoalvarez.com/post/2009/07/06/Como-validar-un-usuario-con-funciones-de-cifrado-del-SQL-Server-sin-almacenar-la-contrasena-en-una-tabla.aspx

    Saludos


    Ing. Jose Mariano Alvarez http://blog.josemarianoalvarez.com/ Microsoft MVP SQLTotal Consulting Mi.Correo.es.j0se.marian0.alvarez@gmail.c0m.Corregirl0 Este mensaje se proporciona tal como es, SIN GARANTIAS de ninguna clase
    Tuesday, July 07, 2009 10:12 PM