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


Vamos continuar o nosso artigo onde na primeira parte criamos o banco de dados Escola e a tabela Usuarios e definimos as classes do projeto para realizar o Login e a autenticação do usuário.

Vamos neste artigo criar as páginas usadas no projeto e verificar se o esquema de autenticação definida esta funcional. Lembrando que no projeto exemplo temos as seguintes escala de permissões:

  1. Administrador - permissão = 1
  2. Diretor - permissão = 2
  3. Professor - permissão = 3
  4. Aluno - permissão = 1

Desejamos implementar a seguinte lógica de acesso ao sistema:

  1. o usuário Administrador terá acesso às páginas do diretor, professor e aluno;
  2. o Diretor terá acesso somente às páginas do professor e aluno;
  3. o professor terá acesso às páginas dele mesmo e às páginas dos alunos;
  4. e o aluno terá somente acesso às suas próprias páginas.

Vamos criar no projeto, a título de exemplo, as páginas abaixo relacionadas com cada nível de acesso.

  1. Administrador : Admin.aspx
  2. Diretor - Diretoria.aspx
  3. Professor - Professores.aspx
  4. Aluno - Alunos.aspx

Criaremos também uma página para realizar o login chamada Login.aspx que irá realizar a autenticação do usuário e uma página AtivarUsuario.aspx que será usada para ativar os usuários cadastrados com perfil inativo.(vou deixar esta página para você implementar)

Criando as páginas do Projeto

Abra o Visual Web Developer 2010 Express e abra o projeto que criamos na primeira parte do artigo acessando o menu File clicando em Open Project e selecionando a solução EscolaNet;

Antes de prosseguir selecione o menu Project e clique em Add Reference;

Na guia .NET selecione o item System.Configuration e clique em OK;

Repetindo o procedimento vamos incluir uma referência ao projeto EscolaNet.Seguranca na guia Projects.

A seguir selecione o projeto ASP .NET EscolaNet e no menu Project clique em Add New Item;

Selecione o template Web Form using Master Page e informe o nome Login.aspx clicando no botão Add;

Na jenal Select a Master Page selecione a master page Site.Master e clique em OK;

Repita o procedimento acima e crie as páginas : Admin.aspx, Alunos.aspx, Professores.aspx, Diretoria.aspx e ReativarAluno.aspx.

Ao final deveremos o projeto exibindo as páginas conforme mostra a figura abaixo:

Vamos ajustar o arquivo Site.Master, a nossa master page, para exibir as páginas criadas no menu da página incluindo o código abaixo (destacado em azul) neste arquivo:

            ...........
            <div class="clear hideSkiplink">
                <asp:Menu ID="NavigationMenu" runat="server" CssClass="menu" EnableViewState="false" IncludeStyleBlock="false" Orientation="Horizontal">
                    <Items>
                        <asp:MenuItem NavigateUrl="~/Default.aspx" Text="Home"/>
                        <asp:MenuItem NavigateUrl="~/About.aspx" Text="About"/>
                        <asp:MenuItem NavigateUrl="~/Admin.aspx" Text="Admin"/>
                        <asp:MenuItem NavigateUrl="~/Alunos.aspx" Text="Alunos"/>
                        <asp:MenuItem NavigateUrl="~/Professores.aspx" Text="Professores"/>
                        <asp:MenuItem NavigateUrl="~/Diretoria.aspx" Text="Diretoria"/>
                    </Items>
                </asp:Menu>
            </div>
            .............. 

A figura abaixo mostra como deverá ficar o leiaute da página Site.Master:

Vamos fazer outros ajustes nos arquivos Default.aspx e About.aspx apenas alterando o texto original. Fique a vontade para alterar conforme seu critério.

Definindo a página de Login

Na página Login.aspx vamos incluir a partir da ToolBox dois controles Label, dois controles TextBox, um botão de comando e um controle Image conforme mostra o código e leiaute da página abaixo:

<%@ Page Title="" Language="vb" AutoEventWireup="false" MasterPageFile="~/Site.Master" 
CodeBehind="Login.aspx.vb" Inherits="EscolaNet.Login1" %>
<asp:Content ID="Content1" ContentPlaceHolderID="HeadContent" runat="server">
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
    <asp:Image ID="Image1" runat="server" Height="85px" 
    ImageUrl="~/Styles/login.jpg" Width="208px" />
<label for ="txtlogin">
<br />
Login</label><br />
  <input type="text" id="txtLogin" runat="server" /> <br />
  <label for ="txtsenha">Senha</label><br />
  <input type="password" id="txtSenha" runat="server" /> 
<br />
<br />
  <span id="mensagem" runat="server"></span>
  <br />
  <asp:Button ID="btnLogin" runat="server" Text="Login" onClick="btnLogin_Click"/>
</asp:Content>

No arquivo code-behind Login.aspx.vb vamos definir o código da página conforme abaixo:

1- namespaces usados:

Imports System
Imports System.Web
Imports System.Web.UI
Imports EscolaNet.Seguranca

2- Propriedade Login : obtém o valor do login e da senha informada pelo usuário nos campos TextBox: txtLogin e txtSenha;

 Public ReadOnly Property Login() As String
        Get
            Return txtLogin.Value.Trim()
        End Get
    End Property
    Public ReadOnly Property Senha() As String
        Get
            Return txtSenha.Value.Trim()
        End Get
    End Property

3- Evento Click do botão - Login - btnLogin - Usa a método validaLogin() e autentica o usuário com as informações de login e senha informadas:

  Protected Sub btnLogin_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnLogin.Click
        If Not Me.validaLogin() Then
            Return
        End If

        Dim autentica As New Autentica()

        If autentica.Login(Me.Login, Me.Senha) Then
            autentica.Redireciona()
        Else
            mensagem.InnerText = "Usuário ou senha inválido(s)"
        End If

    End Sub

4- Método validaLogin - Verifica se a senha e o login informados são validos e retorna true ou false:

 Public Function validaLogin() As Boolean
        Dim erro As Boolean = String.IsNullOrEmpty(Me.Senha) OrElse String.IsNullOrEmpty(Me.Login)
        Return Not erro
    End Function

Definindo o código demais páginas

Não vou entrar em detalhes do leiaute de cada página em cada uma delas vamos ter um texto indicando "Área restrita" e uma Label onde iremos exibir a informação do login do usuário.

Agora vamos definir o código code-behind das páginas Alunos.aspx, Diretoria.aspx, Professores.aspx e Admin.aspx.

Cada uma das páginas deverá herdar da nossa classe Autentica e utilizar os seguintes namespaces:

Imports System
Imports System.Web
Imports System.Web.UI
Imports EscolaNet.Seguranca

1- página Alunos.aspx, code-behind:

Para a página Alunos.aspx o code-behind do arquivo Alunos.aspx.vb deverá ser o seguinte:

Partial Public Class Alunos
    Inherits Autentica

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        lblmsg.Text = " Bem-Vindo " + usuario.Login
    End Sub

End Class

Vamos entender o que foi feito:

Definimos a classe Alunos como partial e herdando da classe Autentica, assim a página ficar acessível somente ao usuário que estiver logado e podemos verificar o nível de acesso do usuário fazendo a restrição com base na permissão do mesmo.

No caso da página Alunos.aspx ele poderá ser acessada por todos os níveis de acesso e portanto não há restrição nenhuma na página.

2- página Professores.aspx, code-behind:

Public Class Professores
    Inherits Autentica

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        If MyBase.usuario.Permissao > Permissoes.Professor Then
            MyBase.Logoff()
        Else
            lblmsg.Text = " Bem-Vindo " + usuario.Login
        End If
    End Sub

End Class

Neste caso como a página Professores.aspx não pode ser acessada pelos alunos mas somente pelos professores, pela diretoria e pelo administrador definimos o código que verifica se a permissão do usuário logado é maior que a permissão de Professor e se isso for verdade faremos o logoff do usuário direcionando-o para a página de Login.(Mybase.Logoff() chama o método da classe base.)

O mesmo raciocínio se aplica para as demais páginas , o que muda a verificação da permissão. Assim temos o código para as demais páginas como segue:

3- página Diretoria.aspx, code-behind:

Public Class Diretoria
    Inherits Autentica

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        If MyBase.usuario.Permissao > Permissoes.Diretor Then
            MyBase.Logoff()
        Else
            lblmsg.Text = " Bem-Vindo " + usuario.Login
        End If
    End Sub

End Class

4- página Admin.aspx , code-behind:

Public Class Admin
    Inherits Autentica
    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        If MyBase.usuario.Permissao <> Permissoes.Administrador Then
            MyBase.Logoff()
        Else
            lblmsg.Text = " Bem-Vindo " + usuario.Login
        End If
    End Sub

End Class

Obs: A página AtivarUsuario.aspx não será abordada neste artigo ficando a seu critério ou não implementá-la.

Executando o projeto ao tentar acessar o menu Admin, Alunos, Professores ou Diretoria será apresentada a página de Login.

Dependendo do perfil do usuário e de seu nível de permissão seu nível de acesso será definido.

Assim se logando como diretor ele será direcionado para sua página:

E terá também acesso às páginas dos alunos e dos professores:

Mas ao tentar a página do administrador será direcionado para a página de login:

E assim constatamos que nossa implementação da autenticação com os níveis de permissão esta funcionando corretamente.

O objetivo do artigo foi mostrar de forma simples como você pode implementar a autenticação e a definição de acesso às páginas de um site ASP .NET.

Outras funcionalidades poderiam ter sido implementadas. Fique a vontade para expandir o projeto.

Pegue o projeto completo aqui: EscolaNet.zip

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.

Joã 12:46 Eu, que sou a luz, vim ao mundo, para que todo aquele que crê em mim não permaneça nas trevas.

Joã 10:9 Eu sou a porta; se alguém entrar a casa; o filho fica entrará e sairá, e achará pastagens.

Joã 6:35 Declarou-lhes Jesus. Eu sou o pão da vida; aquele que vem a mim, de modo algum terá fome, e quem crê em mim jamais terá sede.

Joã_15:1 Eu sou a videira verdadeira, e meu Pai é o viticultor.

Joã 10:11 Eu sou o bom pastor; o bom pastor dá a sua vida pelas ovelhas.

Joã_13:13 Vós me chamais Mestre e Senhor; e dizeis bem, porque eu o sou.

Joã 10:14 Eu sou o bom pastor; conheço as minhas ovelhas, e elas me conhecem,
Joã 10:15 assim como o Pai me conhece e eu conheço o Pai; e dou a minha vida pelas ovelhas.

Joã 11:25 Declarou-lhe Jesus: Eu sou a ressurreição e a vida; quem crê em mim, ainda que morra, viverá;

Referências:


José Carlos Macoratti