En esta entrada voy a mostrar el funcionamiento de un formulario de autentificación que yo he utilizado.
Public Class fAutentificacion
Private Sub btnEntrar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnEntrar.Click
If txtUsuario.Text = "" And txtContrasena.Text = "" Then
MessageBox.Show("Introduzca un usuario y una contraseña", "Autentificación", MessageBoxButtons.OK, MessageBoxIcon.Information)
Else
If txtUsuario.Text = "" Or Validacion.Usuario(txtUsuario.Text) = False Then
MessageBox.Show("Introduzca un nombre de usuario con el formato correcto", "Autentificación", MessageBoxButtons.OK, MessageBoxIcon.Information)
Else
'Comprobamos si las credenciales son correctas
If BD.CredencialesCorrectas(txtUsuario.Text, BD.PasswordHash(txtContrasena.Text)) Then
'Autentificación correcta
Dim fGestion As fAdmin
'Ocultamos el formulario del TPV
Me.Owner.Visible = False
'Ocultamos el formulario de autentificación
Me.Hide()
'Abrimos el formulario al que queremos acceder
fGestion = New fAdmin()
fGestion.ShowDialog(Me.Owner)
Else
'Autentificación incorrecta
MessageBox.Show("Autentificación incorrecta", "Autentificación", MessageBoxButtons.OKCancel, MessageBoxIcon.Error)
End If
End If
End If
End Sub
Private Sub fAutentificacion_FormClosing(ByVal sender As System.Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles MyBase.FormClosing
Me.Owner.Visible = True
End Sub
Private Sub fAutentificacion_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
txtUsuario.Select()
End Sub
End Class
Private Sub btnEntrar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnEntrar.Click
If txtUsuario.Text = "" And txtContrasena.Text = "" Then
MessageBox.Show("Introduzca un usuario y una contraseña", "Autentificación", MessageBoxButtons.OK, MessageBoxIcon.Information)
Else
If txtUsuario.Text = "" Or Validacion.Usuario(txtUsuario.Text) = False Then
MessageBox.Show("Introduzca un nombre de usuario con el formato correcto", "Autentificación", MessageBoxButtons.OK, MessageBoxIcon.Information)
Else
'Comprobamos si las credenciales son correctas
If BD.CredencialesCorrectas(txtUsuario.Text, BD.PasswordHash(txtContrasena.Text)) Then
'Autentificación correcta
Dim fGestion As fAdmin
'Ocultamos el formulario del TPV
Me.Owner.Visible = False
'Ocultamos el formulario de autentificación
Me.Hide()
'Abrimos el formulario al que queremos acceder
fGestion = New fAdmin()
fGestion.ShowDialog(Me.Owner)
Else
'Autentificación incorrecta
MessageBox.Show("Autentificación incorrecta", "Autentificación", MessageBoxButtons.OKCancel, MessageBoxIcon.Error)
End If
End If
End If
End Sub
Private Sub fAutentificacion_FormClosing(ByVal sender As System.Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles MyBase.FormClosing
Me.Owner.Visible = True
End Sub
Private Sub fAutentificacion_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
txtUsuario.Select()
End Sub
End Class
En el código anterior se utilizan algunos métodos que yo he creado especificamente y que muestro a continuación para aclarar totalmente el funcionamiento del código.
'Validación nombre usuario
Public Shared Function Usuario(ByVal cadena As String) As Boolean
If Regex.IsMatch(cadena, "^[a-zA-ZñÑ_][a-zA-ZñÑ0-9._]+$") Then
Return True
Else
Return False
End If
End Function
El código anterior se ocupa de comprobar que el formato del nombre de usuario introducido es correcto. En este caso, sólo se admiten caracteres alfabéticos (mayúsculas y minúsculas y ñ y Ñ), numéricos y los símbolos de puntuación '.' y '_'. Además, el carácter '.' no podrá utilizarse como carácter inicial.
Para realizar la validación se utiliza una expresión regular.
'Autentificación de las credenciales aportadas contra la base de datos
Public Shared Function CredencialesCorrectas(ByRef usuario As String, ByRef contrasena As String) As Boolean
Dim cadenaConexion As String
Dim conexion As OleDbConnection
Dim comando As OleDbCommand
Dim resultado As Integer
Dim consulta As String
cadenaConexion = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & Environment.CurrentDirectory & "\ficheroBD.accdb;Persist Security Info=False;"
conexion = New OleDbConnection(cadenaConexion)
consulta = "SELECT COUNT(*) FROM PERSONAL WHERE StrComp(Nombre,'" & usuario & "',0)=0 AND Contrasena='" & contrasena & "' AND Acceso='Administrador'"
conexion.Open()
comando = New OleDbCommand(consulta, conexion)
resultado = CType(comando.ExecuteScalar(), Integer)
conexion.Close()
If resultado > 0 Then
Return True
Else
Return False
End If
End Function
Public Shared Function CredencialesCorrectas(ByRef usuario As String, ByRef contrasena As String) As Boolean
Dim cadenaConexion As String
Dim conexion As OleDbConnection
Dim comando As OleDbCommand
Dim resultado As Integer
Dim consulta As String
cadenaConexion = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & Environment.CurrentDirectory & "\ficheroBD.accdb;Persist Security Info=False;"
conexion = New OleDbConnection(cadenaConexion)
consulta = "SELECT COUNT(*) FROM PERSONAL WHERE StrComp(Nombre,'" & usuario & "',0)=0 AND Contrasena='" & contrasena & "' AND Acceso='Administrador'"
conexion.Open()
comando = New OleDbCommand(consulta, conexion)
resultado = CType(comando.ExecuteScalar(), Integer)
conexion.Close()
If resultado > 0 Then
Return True
Else
Return False
End If
End Function
El código arriba mostrado realiza la comparación entre los datos aportados por el usuario y los guardados en la base de datos para el nombre de usuario indicado.
'Obtención de la función hash SHA1 de la contraseña (para no mantener
'las contraseñas almacenadas en texto plano)
Public Shared Function PasswordHash(ByVal password As String) As String
Dim bytes() As Byte = Encoding.Unicode.GetBytes(password)
Dim inArray() As Byte = HashAlgorithm.Create("SHA1").ComputeHash(bytes)
Return Convert.ToBase64String(inArray)
End Function
No hay comentarios:
Publicar un comentario