A common practice for company or paid for applications is to register a user with a first and last name and password or user name and password some will have a confirm password. With the information a system will validate if the user exists or not along with self-validation of a password.

The process in this example is dependent on using data annotations so that a validate method can be called against a class instance populated by values (in this case) entered in TextBox controls.

Source code on GitHub

For a simple register/login
Imports System.ComponentModel.DataAnnotations
Imports ValidatorLibrary.Rules

Namespace Classes
    Public Class CustomerLogin

        <Required(ErrorMessage:="{0} is required"), DataType(DataType.Text)>
        <StringLength(20, MinimumLength:=6)>
        Public Property Name() As String

        <Required(ErrorMessage:="{0} is required"), DataType(DataType.Text)>
        <StringLength(20, MinimumLength:=6)>
        <PasswordCheck(ErrorMessage:="{0} must include a number and symbol in {0}")>
        Public Property Password() As String

                 ErrorMessage:="Passwords do not match, please try again")>
        <StringLength(20, MinimumLength:=6)>
        Public Property PasswordConfirmation() As String

    End Class
End Namespace
In the above class a custom rule is used to check if a password has letters, numbers and symbols

Imports System.ComponentModel.DataAnnotations
Imports System.Text.RegularExpressions

Namespace Rules
    Public Class PasswordCheck
        Inherits ValidationAttribute
        Public Overrides Function IsValid(value As Object) As Boolean
            Dim validPassword = False
            Dim reason = String.Empty
            Dim password As String = If(value Is Nothing, String.Empty, value.ToString())

            If String.IsNullOrWhiteSpace(password) OrElse password.Length < 6 Then
                reason = "new password must be at least 6 characters long. "
                Dim reSymbol As New Regex("((?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%]).{6,20})")
                If Not reSymbol.IsMatch(password) Then
                    reason &= "Your new password must contain at least 1 symbol character and number."
                    validPassword = True
                End If
            End If

            If validPassword Then
                Return True
                Return False
            End If

        End Function

    End Class

End Namespace
Implementation in a form to capture user name, password and confirm password
Imports ValidatorLibrary.Classes
Imports ValidatorLibrary.LanguageExtensions
Imports ValidatorLibrary.Validators

Public Class LoginForm
    Private _retryCount As Integer = 0
    Private Sub LoginButton_Click(sender As Object, e As EventArgs) _
        Handles LoginButton.Click

        Dim login As New CustomerLogin With
                    .Name = UserNameTextBox.Text,
                    .Password = PasswordTextBox.Text,
                    .PasswordConfirmation = PasswordConfirmTextBox.Text

        Dim validationResult As EntityValidationResult =

        If validationResult.HasError Then
            If _retryCount >= 3 Then
                MessageBox.Show("Guards toss them out!")
            End If
            _retryCount += 1
            Dim f As New MainForm(login.Name)
        End If
    End Sub
End Class
Screenshot depicting a invalid registration against rules in the customer login class

Name:  F1.png
Views: 91
Size:  12.4 KB

Passwords do not match
Name:  F2.png
Views: 88
Size:  11.3 KB