Segurança em ASP.NET Utilizando Forms Authentication

Você precisa estar logado para dar um feedback. Clique aqui para efetuar o login
Para efetuar o download você precisa estar logado. Clique aqui para efetuar o login
Confirmar voto
0
 (2)  (0)

Neste artigo, abordaremos apenas o recurso Autenticação Forms (Forms Authentication).

msdn07_capa.JPG

Clique aqui para ler todos os artigos desta edição

 

Segurança em ASP.NET

Utilizando Forms Authentication

por Ramon Durães

A segurança é um dos temas de maior importância no desenvolvimento de uma aplicação. Com o crescimento da Internet e o aumento do número de usuários conectados, é cada vez mais eminente o risco de invasão de uma aplicação. Mesmo que o servidor da aplicação esteja protegido por softwares, como o firewall, devemos aumentar ainda mais a segurança e proteger a aplicação também contra acessos indevidos de usuários não-credenciados. Isso quer dizer que um usuário só deverá visualizar uma página se realmente tiver autorização para fazê-lo.

O ASP.NET trouxe um novo modelo de segurança para a sua aplicação Web, que pode ser dividido em duas etapas básicas:

-          Autenticação (valida credenciais)

-          Autorização (determina o que pode ser acessado)

 

Na autenticação, o usuário será validado de acordo com uma base de usuários residentes em um repositório de usuários Windows, armazenados em arquivo XML ou cadastrados em uma base dados SQL. Independentemente do meio de armazenamento utilizado, caberá ao desenvolvedor definir o melhor mecanismo a ser usado, levando sempre em consideração o cenário de uso da aplicação.

Após a identificação do usuário, ocorre o processo de autorização, que consiste em definir se esse usuário terá ou não acesso ao recurso solicitado. Isso significa que o fato de o usuário inserir as devidas credenciais não garante que ele terá acesso ao recurso solicitado. A Figura 1 demonstra o modelo de segurança e apresenta um outro recurso, que consiste em utilizar a camada SSL (Secure Socket Layer) para tornar mais seguro o tráfego de dados entre o servidor e o cliente. Neste artigo, abordaremos apenas o recurso Autenticação Forms (Forms Authentication).

 

 

      

image001.gif
Figura 1. Modelo de segurança ASP.NET.

 

Quem trabalhou com ASP sabe muito bem como é difícil implementar segurança na aplicação. Para isso, era preciso no mínimo criar um código e replicá-lo em todas as páginas, utilizando funções juntamente com variáveis Sessions ou Cookies. Normalmente, um site pode conter diversos tipos de páginas de dados, cadastro, relatórios e informações. Ao tentar acessar uma página protegida, o usuário é redirecionado para uma página padrão de login (veja a Figura 2). Após validar a senha, o ASP.NET cria o Cookie de autenticação e o usuário é automaticamente redirecionado para a página solicitada. Esse tipo de autenticação é um dos mais utilizados no ASP.NET devido à sua facilidade de implementação e à compatibilidade com os diversos cenários de intranet e internet.

 

image002.png
Figura 2. Visualização Login.aspx

 

Implementando página Login.aspx

Para criar uma página de login como a da Figura 2, abra o Visual Studio .NET, crie uma aplicação ASP.NET e, no Solution Explorer, adicione um novo formulário (Add / Add Web Form) denominado login.aspx, contendo os seguintes controles: dois TextBox (ID=txtUsuario e ID=txtSenha TextMode=Password), dois Label (Text=Usuário e Text=Senha) e um LinkButton (Text=Confirmar ID=lnkConfirma).

Para inserir o código, dê um duplo clique no LinkButton (ID=lnkConfirma) e digite o código da Listagem 1. Cabe ressaltar que, antes disso, é necessário referenciar o namespace System.Web.Security para que possamos ter acesso à classe Security. Fazemos isto por meio do comando Imports, que é adicionado sempre no início da página. A explicação encontra-se na própria listagem.


Listagem 1.  Codificando arquivo login.aspx.vb

'Utilizar NameSpace: System.Web.Security

Imports System.Web.Security


Public Class login

  Inherits System.Web.UI.Page

 

Private Sub lnkConfirma_Click(_

   ByVal sender As System.Object, _

   ByVal e As System.EventArgs) _

   Handles btnConfirmar.Click

  'Este código está verificando o usuário e senha

  If txtUsuario.Text = "Convidado" And _

     txtSenha.Text = "1234" Then

     'Em caso de acesso autorizado, chamamos o

     'método abaixo que cria o cookie de autenticação

     'e redireciona usuário para pagina de origem

     FormsAuthentication.RedirectFromLoginPage( _

        txtUsuario.Text, False)

  End If

End Sub

 

 

End Class

 

Pronto, a página de login já está montada. Como neste exemplo não estamos utilizando nenhum banco de dados, o usuário deve digitar usuário "Convidado" e senha "1234" para ter acesso à aplicação. Para trabalhar com banco de dados, você só precisa incluir o código de validação no banco de dados.

Para que a autenticação entre em ação, basta mais uma simples configuração no arquivo web.config. Para quem não conhece esse arquivo, ele é um novo recurso (em formato XML) oferecido pelo ASP.NET para efetuar as configurações de sua aplicação por meio de elementos, tal como informações de acesso a banco de dados. É possível alterar este arquivo a qualquer momento, mas fique atento para o fato de que o ASP.NET monitora as alterações e reinicializa a aplicação web sempre que detecta uma alteração.

Antes de ir para o web.config, vamos analisar nosso primeiro elemento, denominado .

 

(web.config)

 

Mode

Indica o tipo de autenticação a ser utilizada, aceita os seguintes parâmetros: Windows|Forms|Passport|None

Name

Nome do cookie. Use qualquer nome, mas para o caso de várias aplicações que utilizam a mesma autenticação, use o mesmo cookie e altere para definir o mesmo algoritmo de codificação usado nas informações no cookie

Path

Caminho utilizado para o cookie. Esse parâmetro é case-sensitive e uma configuração errada pode gerar erros; o valor padrão é "/" .

LoginUrl

Informa a url da página de login. Ex: login.aspx; se for omitido, buscará por default.aspx

Protection

Indica o nível de proteção das informações no cookie; o recomendado é "ALL"

Timeout

Tempo que o cookie vai expirar no navegador (Browser)

 

Após a autenticação que valida as credenciais do usuário na aplicação, ele precisará estar autorizado para que tenha acesso garantido ao recurso solicitado. Para isso, junto com a autenticação, definimos também a autorização no web.config.

 

Para implementar a autenticação e a autorização no arquivo web.config, localize as tags e e modifique-as de acordo com a Listagem 2.


list02_04.jpg

 

Dentro do elemento o atributo "deny" e "?" bloqueia acesso de usuários não autenticados. Para bloquear todos os usuários troque o “?” (interrogação) pelo "*" (asterisco). A partir daí, você pode tentar abrir qualquer página de sua aplicação e o usuário será automaticamente redirecionado para a página de login (login.aspx). Uma vez validadas as credenciais (Usuário=Convidado e Senha=1234), o usuário será redirecionado para a página solicitada. Até aqui sua aplicação já está protegendo o acesso a todas páginas *.aspx.


Finalizando Login com segurança

Para garantir que o usuário finalize a aplicação com segurança, inclua o namespace System.Web.Security e chame o método FormsAuthentication.SignOut em qualquer página para que o ASP.NET remova o cookie de autenticação. Feito isso, basta você usar o comando Response.Redirect (”login.aspx”) para levar o usuário para tela de Login.

 

Exibindo status da autenticação
Você pode exibir na aplicação informações sobre o tipo de autenticação utilizada e sobre o usuário ativo no momento.


Liberando uma página para acesso sem autenticação

Para liberar uma página ou uma pasta para que os usuários possam acessá-la sem que seja preciso se autenticarem na aplicação, utilize o elemento no arquivo web.config. Para evitar erros, certifique-se de que esse elemento seja inserido no web.config logo após o elemento . Observe o exemplo na Listagem 3. Nele, estão sendo liberadas a página status.aspx e a pasta ajuda, para que qualquer usuário tenha acesso a esses arquivos.

Determinando autorização para grupos de usuários

O ASP.NET permite restringir o acesso a pastas ou arquivos por grupos específicos de usuários. Nos exemplos anteriores, todos os usuários com credenciais válidas tinham acesso a todos os recursos da aplicação. Para modificar esse cenário e determinar que grupo de usuários pode acessar quais páginas, utilize o parâmetro Roles dentro de e crie os grupos. Veja o exemplo da Listagem 4, no qual somente os usuários administradores acessam a pasta admin.


Uma vez modificado o web.config, localize o arquivo global.asax no Solution Explorer. Esse arquivo está presente apenas em aplicações ASP.NET e define os eventos a serem disparados pela aplicação. Dentre os eventos disponíveis no globa.asax, localize o AuthenticateRequest. Este evento é disparado durante o processo de autenticação. Modifique-o conforme a Listagem 5, cujo objetivo é fazer com que a aplicação realize uma consulta na base de dados e localize o grupo ao qual esse usuário pertence. Feito isso, armazene-o na variável UserRoles, que será repassada para o controle de segurança.

 

Listagem 5. Alterando global.asax

Sub Application_AuthenticateRequest( _

    ByVal sender As Object, ByVal e As EventArgs)

 

'Este evento é disparado durante autenticação

If (Not (HttpContext.Current.User Is Nothing)) Then

  If HttpContext.Current.User.Identity.AuthenticationType = "Forms" Then

   'Aqui você faz consulta no banco de dados e

   'obtém os grupos que esse usuário pertence

   'utilizando o UserID do usuário

   'Salve na variável UserRoles. Na falta da consulta

   'ao banco de dados defina Admin p/ todos usuários

 

   Dim UserID As String = _

     HttpContext.Current.User.Identity.Name.ToString

   Dim id As System.Web.Security.FormsIdentity = _

     CType(HttpContext.Current.User.Identity, _

     System.Web.Security.FormsIdentity)


   'Exemplo analizando retorno de uma

   'consulta no banco de dados

   Dim UserRoles() As String

   If UserID = "Convidado" Then

      UserRoles(0) = "Operador"

   Else

      UserRoles(0) = "Admin"

   End If

   'Adicione Roles

   HttpContext.Current.User = _

   New System.Security.Principal.GenericPrincipal( _

       id, UserRoles)

  End If
End If

End Sub

 

Protegendo outros arquivos além dos ‘aspx’

O ASP.NET expande os recursos de segurança da Autenticação Forms para que você possa impedir o download de determinados arquivos presentes na pasta da aplicação, como, por exemplo, uma planilha Excel (*.xls) com uma tabela de preços. Para proteger arquivos *.XLS, siga estes passos:

 

1.     Abra o gerenciador do IIS>Pasta de sua aplicação>Propriedades>Configuração;

2.     Clique em adicionar e digite os seguintes dados:

Ø      Executável: C:\WINNT\Microsoft.NET\Framework\v1.1.4322\aspnet_isapi.dll

Ø      Extensão: .XLS

Ø      Verbos limitar a: POST,GET,HEAD

3.     Pressione OK e note que o `.XLS` aparece na Figura 3. Observe apenas que o caminho da dll está levando em consideração .NET FrameWork 1.1

 

image004.gif
Figura 3. Tela IIS – Propriedades

 

Uma vez feita a configuração no IIS, modifique o arquivo web.config conforme demonstrado na Listagem 6.

 

list06.jpg

 

Assim, você já está protegendo o download de arquivos *.XLS pela pasta de sua aplicação. O usuário que tentar fazer o download desses arquivos será redirecionado para o processo de autenticação.

 

Utilizando a mesma autenticação em duas aplicações diferentes

Um caso básico de utilização dessa facilidade seria um conjunto de sistemas na Intranet da empresa. Imagine o usuário precisando digitar as credenciais em cada aplicação. O ASP.NET permite que, mesmo em aplicações diferentes, o usuário possa realizar o login apenas uma única vez e, com isso, validar os futuros acessos pelas credenciais já informadas (desde que ainda válidas).

Vamos supor que você tenha criado duas aplicações:

App01 --> http://locahost/app01

App02 --> http://locahost/app02


O segredo para que as duas aplicações utilizem o mesmo cookie é definir o mesmo nome para o cookie em ambos os arquivos web.config. Em seguida, na segunda aplicação, informa-se o path da página de login da primeira aplicação. Após isso, precisaremos adicionar o atributo a ambos os web.config: esse atributo faz com que as duas aplicações, além de utilizarem o mesmo nome para o cookie, codifiquem os dados deles utilizando um único algoritmo, o que permite a recuperação em uma das duas aplicações. Você pode implementar essa mesma modificação quando a aplicação estiver rodando em um WebFarm (conjunto de servidores que utilizam a mesma aplicação, seja como cluster ou balanceamento de carga), pois dependendo da estrutura do WebFarm, a requisição pode iniciar em um servidor e a próxima página ser processada em outro. Observe as implementações na
Listagem 7.


list07.jpg 

 

Gerando chaves para

O objetivo de gerar é definir um par de chaves de criptografia de forma que o conteúdo de autenticação do cookie possa ser lido e recuperado em mais de uma aplicação. Sendo assim, todas aplicações que utilizarem o mesmo par de chaves definidas no , utilizaram o mesmo cookie. Permitindo assim a troca de informações.

Adicione um novo formulário (Add / Add Web Form) denominado machine_key.aspx e que contenha um TextBox (TextMode=MultiLine) e um Button (veja a Figura 4). Pressione F7 para abrir a janela de código e digite o código da Listagem 8 para gerar uma nova machineKey.


image005.gif
Figura 4 - Gerando machine key

Adicione um arquivo de classe (Add / Add Class) denominado machine.vb  e coloque o código apresentado na Listagem 9.

Listagem 8. Adicionando código a Machine_key.aspx.vb

Private Sub Button1_Click( _

  ByVal sender As System.Object, _

  ByVal e As System.EventArgs) _

  Handles Button1.Click

 

  TextBox1.Text = Crypto.KeyCreator.CreateMachineKey

End Sub

 

Listagem 9. Criando machine.vb – classe Crypto

'[Original no http://support.microsoft.com/default.aspx?scid=kb;EN-US;313091]

Imports System

Imports System.Text

Imports System.Security.Cryptography

Namespace Crypto

Public Class KeyCreator

  Public Shared Function CreateMachineKey() As String

    Dim decryptionKey As String = CreateKey(24)

    Dim validationKey As String = CreateKey(64)

    Return "

    + validationKey + """ decryptionKey=""" + _

    decryptionKey + """ validation=""SHA1""/>"

  End Function

 

  Public Shared Function CreateKey(_

    ByVal numBytes As Integer) As String

    Dim rng As RNGCryptoServiceProvider = _

        New RNGCryptoServiceProvider

    Dim buff(numBytes - 1) As Byte

    rng.GetBytes(buff)

    Return BytesToHexString(buff)

  End Function

  Public Shared Function BytesToHexString(_

    ByVal bytes As Byte()) As String

    Dim hexString As StringBuilder = _

        New StringBuilder(64)

    Dim counter As Integer

    For counter = 0 To bytes.Length - 1

        hexString.Append(String.Format("{0:X2}", _

        bytes(counter)))

    Next

    Return hexString.ToString()

  End Function

End Class

End Namespace

 

 

Ao rodar essa página, vamos gerar uma nova MachineKey com as chaves para utilização no web.config. Cada clique efetuado no botão irá gerar uma nova chave. Utilize a chave nas aplicações que irão compartilhar a mesma autenticação. E, caso utilize WebFarm, modifique o parâmetro enableViewStateMac para true no WebForm a fim de garantir a segurança no ViewState, bem como a sua leitura e recuperação. 

 

Conclusão

O mecanismo de autenticação do ASP.NET é uma ferramenta muito poderosa e fácil de utilizar. Ela destina-se a complementar uma lacuna deixada pelo ASP, que não oferecia esse mecanismo de segurança para proteger o acesso aos arquivos e necessitava de muito desenvolvimento para criar telas de login. Agora, com poucas linhas de código, você consegue criar um mecanismo profissional de segurança para integra-lo a sua aplicação.

 
Você precisa estar logado para dar um feedback. Clique aqui para efetuar o login
Receba nossas novidades
Ficou com alguma dúvida?