Como hacer Login mediante una base de datos a nivel de código, en Aplicaciones WEB con ASP.NET

Publicado: diciembre 3, 2008 en Categoria All

 

Buen día a todos espero se encuentren muy bien.

Hace poco me escribieron un comentario sobre lo interesante que les pareció en postear un articulo sobre seguridad en aplicaciones web, de hecho me comentaron que querían hacer Login a una base de datos independiente, es decir, desde “Cero” bueno a continuación les presento de manera detallada como deben hacer para lograr los resultados. “Siempre tomanto en cuenta la seguridad”. POR FAVOR ZOOM A LA PAGINA PARA QUE PUEDAN VISUALIZAR MEJOR LAS IMAGENES.

Paso 1.

Acostumbro a trabajar con procedimientos almacenados, por eso de trabajar o hacer consultas a mi base de datos mediante parámetros.

Abro el SQLSERVER 2005 EXPRESS EDITION, y comienzo a crear mi base de datos con sus respectivas tablas.

bd

Crearemos una tabla que se llame usuario

Campos:

id VarChar (50), nombre VarChar (50)

Nos posicionamos encima de tablas (botón derecho) crear nueva tabla

bd1

Paso 2.

 

Comenzamos a llenar la tabla y posteriormente creamos nuestro Stored Procedure.

Importante saber algo, QUE ES UN PROCEDIMIENTO ALMACENADO??

Es un programa que reside en un proveedor de datos, estos se ejecutan directamente en el motor, logrando eficiencia en el proceso. y deshaciéndose de la sobrecarga resultante de comunicar grandes cantidades de datos salientes y entrantes. Internamente poseen código T-SQL.

bdsp

Procedimiento Almacenado:

Al crear el SP, se hace clic en ejecutar para que se cree el procedimiento y se agregue al directorio. Si todo esta bien, entonces el resultado seria: “Comandos completados correctamente.”

codSP

Si la imagen no se ve muy bien entonces aquí esta el código.

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[loginusuario](@identificacion as varchar(50),@nombreusuario as varchar(50))
AS
BEGIN
    Select id,nombre from dbo.usuario where id=@identificacion and nombre=@nombreusuario
END

Para ver si todo esta bien solo necesitamos es probar el SP:

Botón Derecho encima del SP/ ejecutar Procedimiento almacenado.

psp

Clic en Aceptar  y si todo esta bien, aparecerá el registro que estamos buscando. Así:

Rsp

Listo!!! nos olvidamos de SQL : )

Paso 3.

 

Nos vamos a Visual Studio, y comenzamos a colocar nuestro controles, para darle el aspecto del Login del usuario y validar su entrada.

En este paso, lo que voy hacer es colocar:

2 Cuadros de Texto

1 Botón

1 Label (esto es a que solo voy a probar que verdaderamente el usuario existe)

Un ejemplo seria: Es que al validar el usuario me envié a una pagina de solo para miembros como el post pasado. Recuerdas?? Espero que si🙂

Bueno manos a la obra:

a mi sitio lo he llamado WebSiteBlog:

luser

Ahora la idea es la siguiente:

Crear importaciones hacia mi proveedor, y trabajar con el procedimiento almacenado antes creado.

 

Paso 4.

 

Codificar:

Doble Clic en el botón y lo primero que hacemos es trabar con las importaciones (Imports)

Cod

Dentro del botón escribimos lo siguiente.

Como estamos trabajando con seguridad, la idea es colocar dentro del web.config la cadena de conexión, dentro de los tabs

<connectionStrings>

      ‘Aquí
  </connectionStrings>

Dando como resultado esto:

<connectionStrings>
   <add name="conexion" connectionString="Data Source=(local)\sqlexpress; initial catalog=DemostracionLogin; integrated security=true" providerName="System.Data.SqlClient"/>
</connectionStrings>

Guardamos los cambios…

Noten que he colocando el add name= “conexión” es un nombre cualquiera que le he colocado, puedes colocarle el que desees. La idea es identificar tu conexión.

DemostracionLogin: Es el nombre de la base de datos

Listo!!! nos devolvemos a nuestro Default.aspx.vb para seguir codificando la aplicación.

Nota: Como vamos a trabajar con el archivo de configuración, debemos agregar otro Imports. Así:

imports

A.- Hora nos comunicamos con el web.config (cadena de conexión).

Dim conectar As String = ConfigurationManager.ConnectionStrings("conexion").ConnectionString

Noten que hay entre paréntesis el nombre conexión , estamos haciendo referencia a el nombre de mi cadena que se encuentra en el web.config

Continuando con el código,

B.- Declaramos una variable de tipo SQLConexión y le pasamos la conexión de tipo String antes creada.

Dim sqlconectar As SqlConnection = New SqlConnection(conectar)

C.- Luego creamos una variable de tipo SqlCommand y le pasamos los parámetros que son:

  1. El nombre del procedimiento almacenado
  2. la conexión de tipo SQLConexión

Dim cmd As SqlCommand = New SqlCommand("loginusuario", sqlconectar)

"loginusuario": Nombre del procedimiento almacenado.

D.- Debemos indicarle a la variable de tipo SqlCommand que la consulta hacer será hacia un procedimiento almacenado.

cmd.CommandType = CommandType.StoredProcedure

E.- Abrimos Conexión.

cmd.Connection.Open()

F.- Ahora debemos indicar que cuales son los parámetros que debemos pasarle, al procedimiento almacenado y que estos valores vendrán a partir de la introducción de los datos en los cuadros de textos.

cmd.Parameters.Add("@identificacion", SqlDbType.VarChar, 50).Value = txtid.Text

cmd.Parameters.Add("@nombreusuario", SqlDbType.VarChar, 50).Value = txtnombre.Text

G.- Una vez hecho lo anterior, pasamos a recorrer esos datos con el método ExecuteReader para que finalmente verifique si verdaderamente el usuario con sus respectivos datos existe. Para capturar erres en caso que existan, es recomendable trabajar con bloques de excepciones.

Declaramos una variable de tipo SqlDataReader

Try

Dim dr As SqlDataReader = cmd.ExecuteReader

Catch ex As Exception

End Try

H.- Partimos de una condición, si los datos pasados son verdaderos, entonces, muéstrame un mensajes que diga ”Bienvenidos Usuario”, en caso contrario, “El usuario no existe”

If dr.Read Then

lblresult.Text = "Bienvenidos Usuario" & " " & txtnombre.Text

Else
lblresult.Text = "El Usuario no Existe"

End If

I.- En caso de alguna anomalía, conexión entre otros capturamos el error producido con:

Catch ex As Exception
    lblresult.Text = ex.Message
End Try

Y Cerramos conexión:

cmd.Connection.Close()

EL RESULTADO ESPERADO ES:

Código Completo:

Cod

Ejecución.

1.=

bien

7 caracteres como aparece almacenado en la bd campo id

2.=

mal

Adicionalmente, si al validar al usuario colocamos esta línea

FormsAuthentication.RedirectFromLoginPage(txtnombre.Text, False)

Podemos hacer que se dirija a una pagina solo para aquellos que se han autenticado.

Prueben de esta forma:

  1. Cambia el nombre que de la actual pagina, colócale Login.aspx´
  2. Agrega un nuevo elemento WebForm que se llame Default.aspx

Listo!!! Prueba para que veas lo que hace.

HASTA AQUI TODO AMIGOS, ESPERO LES GUSTE LA INFORMACIÓN QUE HE PUBLICADO.

CUALQUIER DUDA NO DUDEN EN ENVIARME AL CORREO

NGOMEZLEAL@HOTMAIL.COM

POR FAVOR, NO SE OLVIDEN DE DEJAR COMENTARIOS, AYUDAN A CRECER, HASTA LA PROXIMA!!!.

Saludos desde Venezuela Nelson Gómez….

comentarios
  1. Haz revisado el esquema de tablas que genera el aspnet_regsql?, o la clase SqlMemberShip?… contiene muy buenas prácticas para hacer Login en nuestras webs, como por ejemplo tener encriptado el password a nivel de base de datos, usar una clase externa para los métodos de login, para tener encapsulados los mismos.

    Saludos,

  2. Nelson Gomez dice:

    Hola sergio si he revisado, de hecho me parece muy bueno hacerlo de esa forma, ya vienen estructuradas las tablas, roles, membresias entre otros. PERO la idea fue de un comentario dejado anteriormente una persona para hacerlo en una base de datos que uno cree desde cero. Independientemente de la que nos aporta asp.net

  3. javierleal dice:

    Hola Nelson Tengo un problema alla con el procedimiento almacenado yo lo copio y pego tal cual como me lo das alla arriba y me da el siguiente error:

    Mens 208, Nivel 16, Estado 6, Procedimiento loginusuario, Línea 4
    El nombre de objeto ‘dbo.loginusuario’ no es válido.

    Pense que era que tenia el nombre de la base de datos diferente al tuyo la mia Se llama demostracionLogin lo cambie y sigue igua, lo que quiere decir que se descarta sea eso espero tu respuesta😀 toma tu tiempo solo estoy haciendo practicas, Saludos compadre espero que estes bien

  4. Nelson Gomez dice:

    Hola javier lo que sucede es lo siguiente:
    No debes copiar y pegar antes de crear el procedimiento almacenado con el nombre de loginusuario. o el que tu desees.

    Te da el error porque SqlServer asume que ya esta creado, al hacer una modificacion del codigo, SqlServer verifica si esta creado, de ser asi, “Comandos completados correctamente.” si no existe te muestra un error, tal y como te esta sucediendo a ti. por ejemplo:

    Mens 208, Nivel 16, Estado 6, Procedimiento loginusuario, Línea 4El nombre de objeto ‘dbo.loginusuario’ no es válido.

    Si te das cuenta, cuando vas a crear por primera vez el PA, te va a salir como codigo lo siguiente:

    CREATE PROCEDURE

    pero cuando ya esta creado e intentas hacer alguna modificacion “Modificar” te aparace:

    ALTER PROCEDURE

    Espero sea de gran ayuda lo que he respondido.

    Saludos a ti tambien. Cuidece…

  5. javierleal dice:

    Ok Nelson intente de nuevo yo le digo crea nuevo procedimiento almacenado y luego tu dices en la guia que le de ejecutar para que se cree pero no se me crea me sale el siguiente error

    Mens. 102, Nivel 15, Estado 1, Línea 6
    Sintaxis incorrecta cerca de ‘<‘.
    Mens. 102, Nivel 15, Estado 1, Línea 17
    Sintaxis incorrecta cerca de ‘<‘.

    tambien intente copiando luego dandole guardar y tampoco a lo que le doy ejecutar me sale el otro ejror que te dije en la parte de loginusuario

  6. Nelson Gomez dice:

    Hola javier,
    Cuando le des crear nuevo PA aparecera algo asi:
    CREATE PROCEDURE
    — Add the parameters for the stored procedure here
    = ,
    =
    AS
    BEGIN
    — SET NOCOUNT ON added to prevent extra result sets from
    — interfering with SELECT statements.
    SET NOCOUNT ON;

    — Insert statements for procedure here
    SELECT ,
    END
    GO

    Luego tu borras cierta informacion para que quede de esta forma:

    CREATE PROCEDURE

    AS
    BEGIN

    END
    GO

    luego tu haces lo siguiente:

    CREATE PROCEDURE loginusuario (@nombreusuario varchar(25), @contrasena varchar(30))

    AS
    BEGIN

    –Aqui colocas el TSQL
    Select nombreusuario, contrasenausuario from TUTABLA
    Where nombreusuario=@nombreusuario and contrasenausuario =@contrasena

    END
    GO

    Luego EJECUTAR y listo!!!

    Espero te sirva la informacion. saludos…

  7. javierleal dice:

    Hola Nelson muchas gracias poco a poco Pude realizar la practica muy buena.. Me ayuda bastante para a empezar en la parte Web..

  8. Carl Arevalo dice:

    Excelente articulo, no tengo mucha experiencia en procesos almacenados de sql server. Siempre quize entender como hacerlos y como funcionaban. Al igual la funcion y utilidad del web,config. Este ejercicio me sirvio y me fuen de mucha utilidad para poderlo hacer y entender.
    Felicitaciones

  9. Tonymix dice:

    Excelente articulo man felicidadess sigue haciendo mas post ocmo estos

  10. k interesante felicitaciones muy buen post …estoy apenas en practicas de lo PA, y este ejemplo es muy bueno :)…

  11. estimado muchas gracias me ayudo mucho yo tambien estoy empezando con la programacion

  12. iori dice:

    Hola Amigo bueno solo queria decirte gracias me ha servido mucho esta demostracion gracias en verdad esta bien especificado….Suerte en todo!!

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s