martes, 8 de julio de 2008

Contraseña de acceso a una aplicacion en VB.NET


Se pueden idear varias estrategias para proteger el acceso a una aplicacion por contraseña. Por ejemplo dehabilitar todos los controles (si estan dentro de paneles será mas fácil ;) ) y habilitarlos al ingresar la contraseña correcta.
La que vamos a mostrar aqui consiste en validar mediante contraseña desde un formulario de acceso y si la validación es correcta invocar al formulario principal. Encararlo de esta manera nos permitirá mostrar varias cositas interesantes en el desarrollo de aplicaciones WinForms.
Lo primero que vamos a hacer es abrir un nuevo proyecto (Archivo --> Nuevo proyecto), en nuestro caso de las plantillas de proyectos de Visual Basic elegiremos Aplicacion Winforms y de nombre le pondremos "ClavedeAcceso".
Tendremos entonces un proyecto con un formulario llamado Form1, haremos de este el formulario principal de la aplicación. Agregamos ahora un nuevo formulario que será donde pidamos la clave de acceso y si es correcta llamaremos al Form1. Hacemos clic derecho sobre el nombre del proyecto --> Agregar --> Windows Forms y seleccionamos Windows Forms y de nombre le ponemos FormAcceso y hacemos clic en Agregar.
Este será nuestro formulario inicial. Si no guardamos el proyecto hasta ahora es un buen momento :)
Configuraremos FormAcceso tal como lo vemos en la figura:"Tiramos" sobre el Form un label, un textBox de nombre txtpass, dos botones de nombres btnAcpetarPass y btnCancelarPass y completamos las propiedades text de los objetos como vemos en la figura.
Este será nuestro formulario inicial y si el usuario ingresa la clave correcta lo redirigiremos al formulario principal y sino saldremos de la aplicación.
Para esto vamos a hacer clic derecho en el nombre del proyecto y en el menú contextual cliqueamos Propiedades.
Destildamos el checkbox "Habilitar marco de trabajo de la aplicación" y en el desplegable "Objeto inicial" seleccionamos "Sub Main".
Es desde "Sub Main" donde en realidad vamos a invocar a los formularios.
Vamos a agregar un archivo de Clases para agregar el codigo del "Sub Main". Hacemos clic derecho en el explorador de proyectos vamos a Agregar y elegimos Clase.
Dejamos el nombre Class1.vb por ahora. En el archivo de la clase escribimos el siguiente código:

Public Class Class1
Public Shared Sub Main()
Application.EnableVisualStyles()

Dim fAcceso As New FormAcceso
If fAcceso.ShowDialog() = System.Windows.Forms.DialogResult.OK Then

fAcceso.Close()
Application.Run(New Form1)

End If End Sub
End Class

SUB Main será el punto de entrada de nuestra aplicación y creará un formulario del tipo FormAcceso donde al usuario se le pedirá la contraseña de acceso. Luego preguntamos por el resultado de fAcceso.ShowDialog() y si este es System.Windows.Forms.DialogResult.OK entonces cerramos el formulario de acceso y llamamos al principal.
fAcceso.Close()
Application.Run(New Form1)
Ahora tenemos que programar FormAcceso para que devuelva System.Windows.Forms.DialogResult.OK si la contraseña es correcta. Veamos como.
En el evento clic del boton Aceptar escribimos el siguiente codigo:
Private Sub btnAceptarPass_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAceptarPass.Click
If txtpass.Text = "Clave" Then
Me.DialogResult = Windows.Forms.DialogResult.OK
Else
Me.DialogResult = Windows.Forms.DialogResult.No
End If
Hide()
End Sub

Aqui si la clave es correcta devolvemos en DialogResult el valor OK:
Me.DialogResult = Windows.Forms.DialogResult.OK

Para completar en el boton Cancelar (y por si el usuario ejecutó la aplicacion solo para ver que era :) ) devolvemos en DialgoResult Cancel.

Private Sub btnCancelarPass_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCancelarPass.Click
Me.DialogResult = Windows.Forms.DialogResult.Cancel
Hide()
End Sub

Además vamos a darle al usuario de que cuando teclee Enter ya se valide la contraseña. Para esto programamos el evento KeyPress del textbox :
Private Sub txtpass_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles txtpass.KeyPress
If (e.KeyChar = Convert.ToChar(Keys.Return)) Or (e.KeyChar = Convert.ToChar(Keys.Enter)) Then
btnAceptarPass_Click(Nothing, Nothing)
End If
End Sub
El evento KeyPress se ejecuta cada vez que el usuario aprieta una tecla y en este caso la comparamos con Enter y Return. La tecla orimida la sabemos con e.KeyChar y con Convert.ToChar(Keys.Enter) la comparamos con Enter . Keys es una enumeración que contiene todas las teclas que puede oprimir el usuario. Consultenla... Es interesante.. :)
En este caso la clave se encuentra embebida en el código. En otro articulo veremos alguna otra alternativa para guardarla.