Para la aplicación se requería una parte de escritorio que gestione los usuarios de cada proveedor (podían ser más de uno), y que se le pueda hacer mantenimiento, nada del otro mundo, para no entorpecer el ambiente de Producción decidí elaborar una tabla alterna tipo puente que albergue el código del proveedor y le asigne un usuario; al comienzo me pareció una mala idea pero con el requerimiento que se vino luego (lo de generar más de un usuario), ayudó mucho ya que con un índice superior podía gestionar los usuarios de forma independiente.
La segunda parte era construir un web site que haga uso de las estructuras y consultas a la información almacenada.
Como expliqué tenemos una aplicación que gestiona usuarios así que debemos empezar por el login. En nuestro proyecto web generamos una nueva página que será la inicial del proyecto.
Es ASP.NET así que arrastramos el control de Login, que nos viene preconfigurado con los campos de usuario, contraseña y si le echan un vistazo a las propiedades verán que tiene mucha funcionalidad, pueden cambiarle los mensajes a español manualmente o utilizar las "culturas" de .NET.
Debería lucir algo como esto:
El candado y las líneas no son parte del componente, eso lo haces con algo de css y maquetación. No te sorprendas si tu control no se ve como este una vez que lo colocas o lo seleccionas aparecerá una flecha en la parte superior derecha que te mostrará un menú con una opción de autoformato:
Ahí pueden elegir en estilo preconfigurado que poseen los controles.
Hasta ahí tenemos un control algo configurado, puedes levantar la página con F5; pero no tendrá funcionalidad porque no lo hemos enlazado en sí a nuestro repositorio de datos. Vamos con el código de importancia, hacemos click derecho sobre nuestro formulario y le damos a la opción "view code", nos llevará al .VB en donde tenemos el código fuente de la funcionalidad:
Agregamos en la parte superior antes de la declaración de la clase lo siguiente:
Imports System Imports System.Data.SqlClient
Con estas líneas podremos utilizar las librerías de conexión a SqlServer.
En la función de Load colocamos el siguiente código:
If Not Me.IsPostBack Then
ViewState("LoginErrors") = 0
End If
Con esto controlamos que en la primera carga no se registren errores de login sobre nuestro control.
Yo declaro una función para realizar la consulta de autenticación:
Private Function MiValidar(ByVal UserName As String, ByVal Password As String) As Boolean
Haber recibe 2 string y returna un boolean, que será True si el usuario existe, colocó bien sus credenciales y está activado en nuestra web para ingresar.
Luego declaro dentro de la función las siguientes variables:
Dim boolReturnValue As Boolean Dim MyConnection As SqlConnection Dim MyDataAdapter As SqlDataAdapter Dim conexion As String Dim reader As SqlDataReaderboolReturnValue: es la variable que retorna mi función.
MyConnection: Variable de conexión de tipo Sql.
MyDataAdapter: Clase que realiza la consulta (lo utilizo porque trabajo todo en base a procedimientos almacenados).
conexion: Cadena que almacenará la cadena de conexión.
reader: variable que me permitirá leer los datos de la consulta realizada con el DataAdapter.
Para iniciar todo y en caso de falla igualamos el bool a False:
boolReturnValue = FalseLuego completamos la función con la siguiente parte:
Try 'Lo colocamos para gestioanr errores
conexion = ConfigurationManager.ConnectionStrings("CadenaConexion").ToString 'Esta parte la utilizamos para obtener la cadena de nuestro WebConfig previamente ya hemos creado un DataSource
MyConnection = New SqlConnection(conexion) 'Construimos la nueva conexión con SqlConnection
MyDataAdapter = New SqlDataAdapter("NombreProcedimeinto", MyConnection) 'Seteamos el nombre del procedimiento y la conexión que utilizará.
MyDataAdapter.SelectCommand.CommandType = CommandType.StoredProcedure 'Le damos el tipo de comando que ejecutará en DataAdapter.
MyDataAdapter.SelectCommand.Parameters.Add(New SqlParameter("@cod", SqlDbType.VarChar, 25)) 'Definimos el Parámetro para luego darle el valor
MyDataAdapter.SelectCommand.Parameters("@cod").Value = UserName 'Le damos el valor del UserName al parámetro creado.
MyDataAdapter.SelectCommand.Parameters.Add(New SqlParameter("@user", SqlDbType.VarChar, 25))
MyDataAdapter.SelectCommand.Parameters("@user").Value = UserName
MyDataAdapter.SelectCommand.Parameters.Add(New SqlParameter("@pass", SqlDbType.VarChar, 25))
MyDataAdapter.SelectCommand.Parameters("@pass").Value = Password
'En esta parte seteamos los valores para cada parámetro teniendo en cuenta los definidos en nuestro procedimiento.
MyConnection.Open() 'Abrimos la conexión para poder ejecutar nuestro DataAdapter
reader = MyDataAdapter.SelectCommand.ExecuteReader() 'Ejecutamos el adapter con la opción que llena nuestro DataReader.
If reader.HasRows Then 'Si el reader tiene data, lo leemos
Do While reader.Read()
Session.Add("codprov", reader.GetInt32(0)) 'Asigno el código de proveedor a una variable de sesión
Session.Add("nomprov", reader.GetString(1)) 'Asigno el nombre del proveedor
Loop
boolReturnValue = True 'Si hemos llegado hasta aquí es porque andamos bien y devolvemos True
Else
boolReturnValue = False
End If
Catch ex As Exception
MsgBox(ex.Message.ToString(), MsgBoxStyle.Critical, "error") ' Control de errores, nos permitirá saber en qué nos hemos equivocado.
End Try
Y al final de estas líneas podemos retiornar el bool:Return boolReturnValueActivamos la propiedad Autenticate de nuestro control Login para agregar el siguiente código:
Private Sub LoginCont_Authenticate(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.AuthenticateEventArgs) Handles LoginCont.Authenticate
If MiValidar(LoginCont.UserName, LoginCont.Password) Then 'Validamos la función creada anteriormente
LoginCont.Visible = False 'Si es verdadera desaparecemos el control Login
Response.Redirect("Página2.aspx") ' Redireccionamos a donde deseamos que se dirija si es que tiene autorización
Else
e.Authenticated = False 'de lo contrario decimos que no se pudo autenticar.
End If
End Sub
Para terminar implementamos el Evento de LoginError del Componente Login, el código que utilicé es el siguiente: Private Sub LoginCont_LoginError(ByVal sender As Object, ByVal e As System.EventArgs) Handles LoginCont.LoginError
If ViewState("LoginErrors") Is Nothing Then
ViewState("LoginErrors") = 0
End If
Dim ErrorCount As Integer = CInt(ViewState("LoginErrors")) + 1
ViewState("LoginErrors") = ErrorCount
If (ErrorCount > 3) AndAlso (LoginCont.PasswordRecoveryUrl <> String.Empty) Then
Response.Redirect(LoginCont.PasswordRecoveryUrl)
End If
End Sub
No hay mucho que explicar más que si el estado "LoginErrors" es diferente de 0 te muestra el mensaje de error; y si los intentos son 3 te envía a la página de recuperación de contraseña, la cual también debemos implementar.Bien eso sería todo para esta entrada, si tienen alguna duda pueden comentarla. Gracias.


No hay comentarios:
Publicar un comentario