Dev & EngARTIGO

ASP .NET – Autenticação/Autorização via código com FormsAuthenticationTicket – Parte 02

No artigo anterior, recordamos os conceitos sobre
autenticação/autorização com ASP .NET↳.NET113 conteúdosNovidades do .NET 9 – o tipo genérico OrderedDictionaryDev (Back & Front) · dez 2024Novidades .NET 10: novas formas de uso do .NET CLIDev (Back & Front) · dez 2025Novidades do .NET 5: implementando um proxy reverso com YARP + ASP.NET 5Dev (Back & Front) · nov 2020Ver tudo em Dev (Back & Front) →, 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 delas, 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 acessar determinado recurso; 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
pastas Admin e Aluno.

Vamos incluir, em cada uma
dessas 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 esse 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

Estrutura da solução AutenticacaoWEB

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:

  • Label
    – Text = Você foi desconectado;
  • Hyperlink
    – ID – NavigateURL = Default.aspx Text= Logar Novamente;

Página
logout.aspx

A página padrão receberá
o nome de default.aspx, contendo os seguintes
controles:

  • LoginName
    – ID= loginName1 – Vai exibir o nome do usuário logado;
  • Hyperlink
    – ID = hplPerfil – vai exibir o link para a página
    conforme o perfil do usuário;
  • Hyperlink
    – ID = lnLogout – NavigateURL = logout.aspx Text=logout

Página default.aspx

O fluxo de acesso
envolvendo as 5 páginas criadas deverá ser o seguinte:

Nesse 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<br />        If ValidaUsuario(txtUsuario.Text, txtSenha.Text) Then<br />            FormsAuthentication.Initialize()<br />            Dim strPerfil As String = AtribuiPerfil(txtUsuario.Text)<br /><br />            'Definimos quanto tempo o usuário irá permanecer logado após deixar o site sem efetuar o logout<br />            Dim fat As FormsAuthenticationTicket = New FormsAuthenticationTicket(1, _<br />                                                                             txtUsuario.Text, DateTime.Now, _<br />                                                                             DateTime.Now.AddMinutes(30), False, <strong>strPerfil</strong>, _<br />                                                                             FormsAuthentication.FormsCookiePath)<br />            Response.Cookies.Add(New HttpCookie(FormsAuthentication.FormsCookieName, FormsAuthentication.Encrypt(fat)))<br />            Response.Redirect(FormsAuthentication.GetRedirectUrl(txtUsuario.Text, False))<br />        Else<br />            'exibe a mensagem de erro<br />            lblError.Visible = True<br />        End If<br />    End Sub

O código acima efetua a
validação do usuário verificando o login e a senha. A
validação que usei nesse exemplo é bem simples e apenas
verifica se o nome do usuário é igual a admin, aluno, funci ou
mestre, e a senha é 123456.

Obs: Essa rotina pode
ser construída usando a verificação das credenciais com os valores armazenados
em um banco de dados↳Banco de dados134 conteúdosSQL ou NoSQL: eis a questão!!Data · mar 2020Banco de dados: como organizar e dar segurança para milhões de dados de loteriasData · mai 20215 serviços gratuitos na cloud para bancos de dados PostgresData · fev 2025Ver tudo em Data →, 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<br />        'Retorna True se o nome e senha do usuário for válido<br /><br />Return CBool(strNomeUsuario = "admin" Or strNomeUsuario = "aluno" Or<br />strNomeUsuario = "funci" Or strNomeUsuario = "mestre" AndAlso<br />strPassword = "123456")<br />    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<br />        'Retorna uma lista do perfil para o usuário<br />        If txtUsuario.Text = "admin" Then<br />            Return strNomeUsuario<br />        ElseIf txtUsuario.Text = "aluno" Then<br />            Return strNomeUsuario<br />        ElseIf txtUsuario.Text = "funci" Then<br />            Return strNomeUsuario<br />        ElseIf txtUsuario.Text = "mestre" Then<br />            Return strNomeUsuario<br />        Else<br />            Return String.Empty<br />        End If<br />    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 esse ticket será a
base da nossa autenticação.

A classe FormsAuthenticationTicket
é usada para criar um objeto que representa o ticket de
autenticação, que é usado pela autenticação de formulários
para identificar um usuário autenticado. As propriedades e
os valores de um ticket 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)<br />        ''Fires upon attempting to authenticate the use<br />        If Not (HttpContext.Current.User Is Nothing) Then<br />            'Usando as classes de identidade vamos obter o perfil e carregar na aplicação   <br />            If HttpContext.Current.User.Identity.IsAuthenticated Then<br />                If TypeOf HttpContext.Current.User.Identity Is FormsIdentity Then<br />                    Dim fi As FormsIdentity = CType(HttpContext.Current.User.Identity, FormsIdentity)<br />                    'obtém o ticket de autenticação<br />                    Dim fat As FormsAuthenticationTicket = fi.Ticket<br />                    Dim astrPerfis As String() = fat.UserData.Split("|"c)<br /><strong>                    HttpContext.Current.User = New GenericPrincipal(fi, astrPerfis)</strong><br />                End If<br />            End If<br />        End If<br />    End Sub

Se o usuário for válido e
for autenticado com sucesso, será direcionado para a página default.aspx.
Nessa 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:

  • NavigateUrl
    -> o link para a página relacionada com o perfil do
    usuário;
  • Text
    – o texto adequado ao perfil;
  • Visible
    – exibimos ou não o link verificando se o usuário
    pertence ao um perfil através do código :Pager.User.IsInRole(“nome_do_perfil”)

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<br /><br />        lblAviso.Text = "Benvindo : "<br />        If Page.User.IsInRole("admin") Then<br />            hplPerfil.NavigateUrl = "~/Admin/admin.aspx"<br />            hplPerfil.Text = "Acesso a página de Administração"<br />            hplPerfil.Visible = Page.User.IsInRole("admin")<br />        ElseIf Page.User.IsInRole("aluno") Then<br />            hplPerfil.NavigateUrl = "~/Aluno/aluno.aspx"<br />            hplPerfil.Text = "Acesso a página de Notas"<br />            hplPerfil.Visible = Page.User.IsInRole("aluno")<br />        ElseIf Page.User.IsInRole("funci") Then<br />            hplPerfil.NavigateUrl = "funci.aspx"<br />            hplPerfil.Text = "Acesso a página de Cadastro de Alunos"<br />            hplPerfil.Visible = Page.User.IsInRole("funci")<br />        ElseIf Page.User.IsInRole("mestre") Then<br />            hplPerfil.NavigateUrl = "mestre.aspx"<br />            hplPerfil.Text = "Acesso a página de Planejamento de Cursos"<br />            hplPerfil.Visible = Page.User.IsInRole("mestre")<br />        End If<br />    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 navegador.

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<br />        Session.Abandon()<br />        'remove o tickect de autenticação<br />        FormsAuthentication.SignOut()<br />    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 o 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

Eu sei, é apenas ASP .NET, mas eu gosto…

Simples, simples assim…

é referência em Visual Basic no Brasil e autor dos livros "Aprenda Rápido: ASP" e "ASP, ADO e Banco de Dados na Internet". Mantenedor do site macoratti.net.

Mais de José Carlos Macoratti
Ver perfil →