ASP .NET - Autenticação de usuários - I


A ASP .NET possui recursos embutidos que podemos usar para definir a autenticação de usuários em aplicações Web. O conjunto dos novos recursos (desde a versão 2.0) chamados provedores faz parte da nova arquitetura chamada Provider Model onde os providers são componentes que fornecem serviços configuráveis idênticos aos plug-ins.

Os providers Roles e MemberShip fornecem os recursos para gerenciar a autenticação e autorização. Onde a autenticação é o processo para verificar a identidade do usuário e a autorização refere-se ao gerenciamento das permissões dos usuários.

Nas referências deste artigo você encontra alguns dos artigo onde eu já tratei do assunto usando os providers e o membership da ASP .NET.

Neste artigo eu pretendo mostrar como você mesmo pode implementar a autenticação de usuários em seu site ASP .NET. Vou começar definindo o cenário no qual vamos trabalhar:

Iremos implementar a autenticação de usuários em uma escola onde deveremos definir as permissões de acesso as páginas para os perfis de Administrator, Diretor, Professor e Aluno. Vamos usar os recursos da orientação a objetos e definir em um projeto Class Library uma classe base onde iremos implementar as funcionalidades pertinentes ao processo de autenticação. Deveremos também implementar as funcionalidades que permitem realizar a manutenção dos usuários.

Os recursos usados neste projeto serão:

  1. Visual Web Developer 2010 Express Edition
  2. Linguagem VB .NET
  3. SQL Server 2008 Express Edition
  4. SQL Server Management Studio 2008 Express Edition (SSMS)

Todos os recursos usados são gratuitos.

Criando o banco de dados e a tabela da aplicação

Abra o Visual SQL Server Management Studio e clique com o botão direito do mouse sobre o item Banco de dados (DataBase) e selecione Novo Banco de dados (New DataBase) :

Obs: As mensagens do meu SSMS estão em português pois eu apliquei o pacote de localização

A seguir informe o nome do banco de dados Escola e clique no botão OK para criar o banco de dados Escola.mdf.

Expanda os itens do banco de dados e clique com o botão direito do mouse sobre o item Tabelas e a seguir em Nova Tabela:

A seguir defina a estrutura da tabela Usuarios conforme a figura abaixo onde temos os campos: id, login,senha, ativo,permissao e email. Sendo que o campo id é uma chave primária do tipo identity.

Agora temos que definir uma stored procedure no banco de dados Escola que deverá realizar a autenticação do usuário verificando se o login e a senha do usuário estão cadastrados na tabela Usuarios.

Expanda o item Programação do banco de dados Escola e clique com o botão direito do mouse sobre o item Procedimentos Armazenados e a seguir em Novo Procedimento Armazenado...

A seguir digite o código que define a criação da stored procedure (CREATE PROCEDURE) com o nome Autenticacao e utiliza os parâmetros @login e @senha e utiliza a instrução SQL SELECT:

Assim já temos o banco de dados Escola e a tabela Usuarios criados e prontos para uso.

Agora vamos incluir alguns registros na tabela Usuarios e para isso vamos usar a instrução SQL INSERT INTO Abaixo um exemplo que inclui um usuário com permissão de Administrador. (para as demais permissões basta alterar a permissão e o login)

INSERT INTO [Escola].[dbo].[Usuarios]
([login]
     ,[senha]
     ,[ativo]
     ,[permissao]
     ,[email])
VALUES
     ('admin'
     ,'123456'
     ,1
     ,1
     ,'admin@bol.com.br')
GO

Ao final deveremos ter a tabela com os seguintes valores:

Iremos usar esses valores para testar o nosso projeto.

Definindo o projeto ASP .NET

Abra o Visual Web Developer 2010 Express e no menu File clique em New Project;

A seguir selecione a linguagem Visual Basic e o template Web e a seguir clique em ASP .NET Web Application informando o nome EscolaNet e clique no botão OK;

O template ASP .NET Web Application cria um projeto com uma estrutura definida que usa uma master page e algumas definições para conta de usuário que iremos remover deixando somente as páginas ASP .NET.

A seguir no menu File clique em Add -> New Project e selecione os templates Visual Basic -> Windows e Class Library informando o no me EscolaNet.Seguranca e clique no botão OK;

Teremos assim uma solução contendo dois projetos: EscolaNet e EscolaNet.Seguranca

Vamos definir o código do projeto EscolaNet.Seguranca

Renomeia o arquivo Class1.vb para Usuario.vb e defina neste arquivo o código abaixo:

Public Class Usuario

    Public Enum Permissoes
        Administrador = 1
        Diretor = 2
        Professor = 3
        Aluno = 4
    End Enum

    Public Property ID() As Integer
        Get
            Return m_id
        End Get
        Set(ByVal value As Integer)
            m_id = value
        End Set
    End Property
    Private m_id As Integer
    Public Property Login() As String
        Get
            Return m_login
        End Get
        Set(ByVal value As String)
            m_login = value
        End Set
    End Property
    Private m_login As String
    Public Property Senha() As String
        Get
            Return m_senha
        End Get
        Set(ByVal value As String)
            m_senha = value
        End Set
    End Property
    Private m_senha As String
    Public Property Ativo() As Boolean
        Get
            Return m_ativo
        End Get
        Set(ByVal value As Boolean)
            m_ativo = value
        End Set
    End Property
    Private m_ativo As Boolean
    Public Property Permissao() As Permissoes
        Get
            Return m_Permissao
        End Get
        Set(ByVal value As Permissoes)
            m_Permissao = value
        End Set
    End Property
    Private m_Permissao As Permissoes
    Public Property Email() As String
        Get
            Return m_email
        End Get
        Set(ByVal value As String)
            m_email = value
        End Set
    End Property
    Private m_email As String
End Class
No arquivo Usuario.vb estamos definindo 5 propriedades:
  1. ID
  2. Login
  3. Senha
  4. Ativo
  5. Permissao
  6. Email

que representam um usuário do nosso domínio e cujas
informações serão persistidas na tabela Usuarios

Eu não vou implementar outros métodos como Salvar,Excluir,
etc. por questão de simplicidade e para focar somente
na autenticação do usuário.

Definimos também uma enumeração para as permissões com
os seguintes valores:

Administrador = 1
Diretor = 2
Professor = 3
Aluno = 4

A seguir vamos incluir outra classe no projeto via menu Project -> Add Class com o nome Autentica.vb e inserir nesta classe o código a seguir:

Imports System.Data;
Imports System.Data.SqlClient
Imports System.Configuration
Imports System.Collections.Generic
Imports System.Web

Public Class Autentica
    Inherits System.Web.UI.Page

    Public Enum Permissoes
        Administrador = 1
        Diretor = 2
        Professor = 3
        Aluno = 4
    End Enum

    Public Property usuario() As Usuario
        Get
            Return TryCast(HttpContext.Current.Session("Usuario"), Usuario)
        End Get
        Set(ByVal value As Usuario)
            HttpContext.Current.Session("Usuario") = value
        End Set
    End Property

    Public Sub New()
    End Sub

    Protected Overrides Sub OnLoad(ByVal e As EventArgs)
        If Me.Usuario Is Nothing Then
            Me.Redireciona()
        Else()
            MyBase.OnLoad(e)
        End If
    End Sub


    Public Function Login(ByVal _login As String, ByVal _senha As String) As Boolean
        Dim conexao As New SqlConnection(ConfigurationManager.ConnectionStrings("Escola").ConnectionString)
        Dim comando As New SqlCommand("Autenticacao", conexao)

        Dim leitor As SqlDataReader
        comando.CommandType = CommandType.StoredProcedure
        comando.Parameters.Add(New SqlParameter("@login", _login))
        comando.Parameters.Add(New SqlParameter("@senha", _senha))

        Try
            conexao.Open()
            leitor = comando.ExecuteReader()
            If leitor.HasRows Then
                Me.usuario = New Usuario() With { _
                 .ID = Integer.Parse(leitor("id").ToString()), _
                 .Login = _login, _
                 .Senha = _senha, _
                 .Ativo = leitor("ativo").ToString() <> "0", _
                 .Permissao = DirectCast(Integer.Parse(leitor("permissao").ToString()), Permissoes) _
                }
            Else
                Me.usuario = Nothing
                leitor.Close()
            End If
        Catch generatedExceptionName As Exception
            Throw
        Finally
            conexao.Close()
        End Try
        Return Me.usuario IsNot Nothing
    End Function

    Public Sub Logoff()
        Me.usuario = Nothing
        Me.Redireciona()
    End Sub

    Public Sub Redireciona()

        If Me.Usuario Is Nothing Then
            HttpContext.Current.Response.Redirect("~/Login.aspx")
        End If

        'Há implementar 
       ' If Not Me.Usuario.Ativo Then
       '     HttpContext.Current.Response.Redirect("~/AtivaUsuario.aspx")
       ' End If

        Select Case Me.Usuario.Permissao
            Case Permissoes.Aluno
                HttpContext.Current.Response.Redirect("~/Alunos.aspx")
                Exit Select

            Case Permissoes.Administrador
                HttpContext.Current.Response.Redirect("~/Admin.aspx")
                Exit Select

            Case Permissoes.Diretor
                HttpContext.Current.Response.Redirect("~/Diretoria.aspx")
                Exit Select

            Case Permissoes.Professor
                HttpContext.Current.Response.Redirect("~/Professores.aspx")
                Exit Select
        End Select
    End Sub

End Class

No código desta classe temos o seguinte:

Estamos usando a classe HttpContext que engloba todas as informações específicas de uma requisição HTTP. O objeto HttpContext da requisição HTTP (do namespace System.Web) atual fornece acesso aos objetos intrínsecos Request , Response e Server para a requisição.

Agora abra o arquivo Web.Config e defina o código na página configurando a string de conexão

.............
  <connectionStrings>
    <add name="
Escola"
     connectionString=
"Data Source=.\SQLEXPRESS;Initial Catalog=Escola;Integrated Security= True"
     providerName="System.Data.SqlClient" />
  </connectionStrings>
.......................

Dessa forma estamos prontos para definir as páginas do projeto e acessar o banco de dados e a tabela Usuarios.

Aguarde a segunda parte do artigo: ASP .NET - Autenticação de usuários - II

Rom 3:10 como está escrito: Não há justo, nem sequer um.

Rom 3:11 Não há quem entenda; não há quem busque a Deus.

Rom 3:12 Todos se extraviaram; juntamente se fizeram inúteis. Não há quem faça o bem, não há nem um só.

Efs 2:8 Porque pela graça sois salvos, por meio da fé; e isto não vem de vós, é dom de Deus;

Joã 14:6 Respondeu-lhe Jesus: Eu sou o caminho, e a verdade, e a vida; ninguém vem ao Pai, senão por mim.

        Rom 5:1 Justificados, pois, pela fé, tenhamos paz com Deus, por nosso Senhor Jesus Cristo,

        Rom 5:2 por quem obtivemos também nosso acesso pela fé a esta graça, na qual estamos firmes, e gloriemo-nos na esperança da glória de Deus.

Referências:


José Carlos Macoratti