 ASP
.NET - Autenticação/Autorização via código com FormsAuthenticationTicket - 2
ASP
.NET - Autenticação/Autorização via código com FormsAuthenticationTicket - 2
No artigo anterior recordamos os conceitos básicos sobre autenticação/autorização com ASP .NET, definimos o nosso objetivo , criamos o projeto no Visual Web Developer 2010 Express e configuramos o nosso arquivo web.config. Vamos continuar criando as pastas, o código e as páginas para permitir o acesso baseado no perfil do usuário.
Gostaria de dizer que existe mais de uma forma de implementar toda essa funcionalidade e vou mostrar uma deles portanto você pode alcançar o mesmo objetivo com algumas variações.
O arquivo web.config é o coração da nossa aplicação pois é ele que vai decidir quem pode ou não pode acessar determinado recurso, e com ajuda de outros recursos podemos por nosso projeto para funcionar.
Vamos criar duas pastas no nosso projeto, clique com o botão direito sobre o nome do projeto e selecione a opção Add -> New Folder e crie as pastas Admin e Aluno.
Obs: A criação das pastas para os outros perfis (funci e mestre) é feita da mesma forma e possui o mesmo funcionamento aplicados às pasta Admin e Aluno.
Vamos incluir em cada uma destas pastas um formulário Web. Clique com o botão direito sobre a pasta Admin e selecione Add -> New Item e escolha o template Web Form e informe o nome admin.aspx, repita o processo e inclua na pasta Aluno a página aluno.aspx.
Obs: Poderia ter usado uma master page para herdar o cabeçalho, fica a seu critério usar este recurso.
O conteúdo das páginas admin.aspx e aluno.aspx será muito simples, apenas um cabeçalho e uma linha de texto para identificar a página. Veja abaixo como deve ficar o leiaute das páginas alunos.aspx e admin.aspx e a estrutura da solução AutenticacaoWEB exibida na janela Solution Explorer;
|  | 
 | |
| Figura 1.0 - Página alunos.aspx da pasta Alunos | ||
|  | ||
| Figura 2.0 - Página admin.aspx da pasta Admin | 
Vamos a seguir criar a página de login da aplicação que será usada para autenticar o usuário solicitando seu login e sua senha. A página será bem simples contendo um cabeçalho , dois controles TextBox (ID=txtUsuario e ID=txtSenha ), um controle Button (ID=btnLogin) e um controle Label (ID=lblError) definidos conforme o leiaute abaixo:
|  | Página login.aspx | 
Precisamos criar também mais duas páginas uma para realizar o logout e a página padrão para a qual o usuário deverá ser direcionado após fazer o login com sucesso.
Para criar a página logout.aspx clique com o botão direito do mouse sobre o nome do projeto e selecione Add-> New Item, escolha o template Web Form e informe o nome logout.aspx a seguir inclua os controles:
|  | 
| página logout.aspx | 
A página padrão receberá o nome de default.aspx contendo os seguintes controles:
|  | 
| página default.aspx | 
O fluxo de acesso envolvendo as 5 páginas criadas deverá ser o seguinte:
|  | 
Neste momento a estrutura da nossa solução exibida na janela Solution Explorer deverá ser a seguinte:
|  | 
Vamos agora analisar o arquivo web.config e verificar qual a lógica de acesso e permissão implementadas:
|  | 
Obs: Como não definimos o atributo defaultUrl a página default.aspx será a página para a qual o usuário será direcionado após efetuar o login com sucesso.
Dessa forma pelo que definimos no arquivo web.config, somente os usuários com os perfis criados terão acesso ao site, e, após efetuarem o login deveremos identificar o perfil do usuário redirecionando-o para o respectivo recurso.
Definindo o código do projeto
Vamos agora definir o código usado em cada página do nosso projeto começando com a página login.aspx.
No evento Click do botão Login vamos colocar o código para validar o usuário e definir o seu perfil. No arquivo login.aspx.vb inclua o seguinte código :
- Declaração do namespace: Imports System.Web.Security
O namespace
System.Web.Security contém classes que são usadas para
implementar a segurança do ASP.NET em aplicativos web.
- Código do evento Click
do botão Login:
| Protected Sub btnLogin_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnLogin.Click If ValidaUsuario(txtUsuario.Text, txtSenha.Text) Then FormsAuthentication.Initialize() Dim strPerfil As String = AtribuiPerfil(txtUsuario.Text) 'Definimos quanto tempo o usuário irá permanecer logado após deixar o site sem efetuar o logout Dim fat As FormsAuthenticationTicket = New FormsAuthenticationTicket(1, _ txtUsuario.Text, DateTime.Now, _ DateTime.Now.AddMinutes(30), False, strPerfil, _ FormsAuthentication.FormsCookiePath) Response.Cookies.Add(New HttpCookie(FormsAuthentication.FormsCookieName, FormsAuthentication.Encrypt(fat))) Response.Redirect(FormsAuthentication.GetRedirectUrl(txtUsuario.Text, False)) Else 'exibe a mensagem de erro lblError.Visible = True End If End Sub | 
O código acima efetua a validação do usuário verificando o login e a senha;. A validação que usei neste exemplo é bem simples e apenas verifica se o nome do usuário é igual a admin,aluno,funci ou mestre e a senha é 123456.
Obs: Esta rotina pode ser construída usando a verificação das credenciais com os valores armazenados em um banco de dados mas por questão de simplicidade eu vou usar apenas uma definição de valores com strings.
|  Private Function ValidaUsuario(ByVal strNomeUsuario As String, ByVal strPassword As String) As Boolean
        'Retorna True se o nome e senha do usuário for válido
        Return CBool(strNomeUsuario = "admin" Or strNomeUsuario = "aluno" Or strNomeUsuario = "funci" Or strNomeUsuario = "mestre" AndAlso strPassword = "123456")
    End Function | 
Se o usuário for válido primeiro atribuímos o perfil conforme o seu nome (no nosso exemplo o nome é igual ao perfil por pura preguiça...) conforme o código abaixo:
| Private Function AtribuiPerfil(ByVal strNomeUsuario As String) As String
        'Retorna uma lista do perfil para o usuário
        If txtUsuario.Text = "admin" Then
            Return strNomeUsuario
        ElseIf txtUsuario.Text = "aluno" Then
            Return strNomeUsuario
        ElseIf txtUsuario.Text = "funci" Then
            Return strNomeUsuario
        ElseIf txtUsuario.Text = "mestre" Then
            Return strNomeUsuario
        Else
            Return String.Empty
        End If
    End Function | 
Em seguida criamos um ticket chamado fat usando a classe FormsAuthenticationTicket();
Criamos um ticket com os dados do usuário e também os perfis carregados e este ticket será a base da nossa autenticação.
A classe FormsAuthenticationTicket é usada para criar um objeto que representa o tíquete de autenticação que é usado pela autenticação de formulários para identificar um usuário autenticado.As propriedades e valores de um tíquete de autenticação de formulários são convertidos para uma cadeia de caracteres criptografada armazenada em um cookie ou na URL.
Os valores de FormsAuthenticationTicket
para o usuário atual autenticado podem ser acessados usando a
propriedade Ticket da classe FormsIdentity.Você
pode acessar o objeto FormsIdentity atual
convertendo a propriedade Identity do usuário atual
para o tipo FormsIdentity.
Agora temos que criar um arquivo Global.asax e no evento AuthenticateRequest
, que ocorre quando um usuário tenta se autenticar, temos que
definir uma rotina para carregar os perfis dos usuários para que
o ASP .NET os reconheça;
Inclua um arquivo Global.asax no projeto e no evento AuthenticateRequest defina o seguinte código:
|  Sub Application_AuthenticateRequest(ByVal sender As Object, ByVal e As EventArgs)
        ''Fires upon attempting to authenticate the use
        If Not (HttpContext.Current.User Is Nothing) Then
            'Usando as classes de identidade vamos obter o perfil e carregar na aplicação   
            If HttpContext.Current.User.Identity.IsAuthenticated Then
                If TypeOf HttpContext.Current.User.Identity Is FormsIdentity Then
                    Dim fi As FormsIdentity = CType(HttpContext.Current.User.Identity, FormsIdentity)
                    'obtém o ticket de autenticação
                    Dim fat As FormsAuthenticationTicket = fi.Ticket
                    Dim astrPerfis As String() = fat.UserData.Split("|"c)
                    HttpContext.Current.User = New GenericPrincipal(fi, astrPerfis)
                End If
            End If
        End If
    End Sub | 
Se o usuário for válido e for autenticado com sucesso será direcionado para a página default.aspx. Nesta página exibimos o nome do usuário usando o controle LoginName e no controle Hyperlink vamos definir de forma dinâmica as seguintes propriedades do controle:
A seguir temos o código no evento Load que vai tomar essas decisões definindo essas propriedades conforme o perfil carregado do usuário atual;
|  Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        lblAviso.Text = "Benvindo : "
        If Page.User.IsInRole("admin") Then
            hplPerfil.NavigateUrl = "~/Admin/admin.aspx"
            hplPerfil.Text = "Acesso a página de Administração"
            hplPerfil.Visible = Page.User.IsInRole("admin")
        ElseIf Page.User.IsInRole("aluno") Then
            hplPerfil.NavigateUrl = "~/Aluno/aluno.aspx"
            hplPerfil.Text = "Acesso a página de Notas"
            hplPerfil.Visible = Page.User.IsInRole("aluno")
        ElseIf Page.User.IsInRole("funci") Then
            hplPerfil.NavigateUrl = "funci.aspx"
            hplPerfil.Text = "Acesso a página de Cadastro de Alunos"
            hplPerfil.Visible = Page.User.IsInRole("funci")
        ElseIf Page.User.IsInRole("mestre") Then
            hplPerfil.NavigateUrl = "mestre.aspx"
            hplPerfil.Text = "Acesso a página de Planejamento de Cursos"
            hplPerfil.Visible = Page.User.IsInRole("mestre")
        End If
    End Sub | 
Agora só falta definir o código da página logout.aspx para que a sessão seja encerrada e o ticket de autenticação de formulários seja removido do navegado;
Fazemos isso incluindo o código abaixo no evento Load da página:
|  Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        Session.Abandon()
        'remove o tickect de autenticação
        FormsAuthentication.SignOut()
    End Sub | 
Agora só falta testar:
Executando o projeto será apresentada a página login.aspx (pois negamos o acesso a todos os usuários ao raiz do site);
|   | 
Após efetuar o login com o perfil aluno informando um login e senha válidos será apresentada a página default.aspx exibindo o nome do usuário logado , o texto e link para acesso à página /Aluno/aluno.aspx;
|  | 
Ao clicar no link o usuário terá acesso a página aluno.aspx conforme figura abaixo:
|  | 
Como eu já mencionei existem outras maneiras de obter o mesmo resultado e em outro artigo irei mostrar isso usando a linguagem C#.
Pegue o projeto completo
aqui:  AutenticacaoWEB.zip
 AutenticacaoWEB.zip
Eu sei é apenas ASP .NET, mas eu gosto...
Simples, simples assim...
Referências: