Neste artigo eu volto ao
assunto da autenticação e da autorização em aplicações ASP
.NET, com o objetivo de mostrar
como implementar a autenticação com base em perfis do usuário
via código usando a classe FormsAuthenticationTicket
e os recursos do ASP .NET.
Apenas para recordar, você já deve
saber que a ASP .NET pode controlar o processo de autenticação
de forma automática, bastando para isso configurar o arquivo web.config
para realizar a autenticação via formulário. A partir deste
momento, a ASP .NET passa a verificar em todos os acessos se a
página está ou não logada através do cookie
de autenticação existente. Se o cookie não existir, a
requisição será direcionada para o formulário definido no
arquivo web.config.
Um cookie é um pequeno texto que os sites podem enviar aos navegadores,
anexado a qualquer conexão. Nas visitas posteriores, o navegador reenvia os
dados para o servidor dono do cookie. A transmissão de cookies, por padrão, é
invisível ao usuário. Mas você pode configurar o Firefox para lhe alertar
sobre eles ou ver os cookies armazenados. Um cookie é transmitido até que
perca a validade, que é definida pelo site. Os sites geralmente usam os cookies
para distinguir usuários e memorizar preferências.
Então, para o processo ser ativado,
basta definir a seguinte declaração no arquivo web.config,
na seção <sistem.web>:
<authentication
mode=”Forms”>
Existem 4 parâmetros que o authentication mode aceita:
- None:
Indica que não existe nenhuma forma de autenticação do
usuário; - Windows:
O ASP .NET usa o IIS (Internet Information Service) para autenticar usuários e senhas. O IIS trabalha de três formas: Básico,
Digest e Integrado com o Windows, e em cada um deles a
opção de usuário anônimo deverá estar
desabilitada e conforme a aplicação ASP .NET; - Passport:
Este tipo de autenticação é utilizado através dos
servidores da Microsoft, de forma única e centralizada.
O usuário e a senha são as mesmas que o cliente utiliza
para acessar o Hotmail e outros sites da Microsoft; - Forms:
É a forma mais usada e permite que o programador possa
implementar o seu próprio código de autenticação
usando as classes pertinente.;
Além disso, podemos definir
outros parâmetros que serão usados no processo conforme o
exemplo a seguir:
<!-- definindo o tipo de autenticação-->
<authentication mode="Forms" >
<forms
loginUrl="Login.aspx"
protection="All"
path="/"
defaultUrl="Admin/Index.aspx"
name="Acesso"
timeout="20">
<credentials passwordFormat="Clear">
<user name="macoratti" password="123456"/>
<user name="batman" password="123456"/>
</credentials>
</forms>
</authentication>
- loginUrl
=”Login.apx” – Indica que a página
para onde o usuário vai ser direcionado para
efetuar a autenticação
é a página Login.aspx; - Protection
=”All” – O cookie de dados está sendo
validado e criptografado; - Path=”/” – O
local onde o cookie vai ser gerado; - defaultUrl=”Admin/Index.aspx”
– A página Index.aspx da pasta Admin será
chamada após o usuário ser autenticado com
sucesso; - name
=”Acesso” – O nome do cookie; - timeout=”20″
– O cookie de autenticação gerado expira em 20
minutos.
Na tag <credentials>
definimos que o formato de armazenamento será Clear
e definimos dois usuários e senhas que poderão ter acesso aos recursos definidos no web.config.
A tag <forms>
apresenta os seguintes atributos mais importantes:
- name:
Indica o nome do principal Cookie através do
qual o aplicativo ASP .NET vai fazer a autenticação dos
usuários; - loginUrl:
Indica qual a página ASPX para a qual o usuário será
redirecionado se o usuário não estiver autenticado; - timeout: Este atributo é responsável por cuidar do tempo que o
aplicativo poderá demorar para realizar a
autenticação, caso contrário não sairá da página de
login. A unidade de medida para esse tempo é o segundo; - path:
Iindica qual diretório virtual do IIS onde a
autenticação será utilizada; - defaultUrl –
Indica o nome da página para qual o usuário será
direcionado caso ele esteja autenticado com sucesso;(A
página padrão é default.aspx); - protection –
Indica o método usado para proteger o cookie gerado com
os dados do login.Os métodos possíveis são:- All
– Efetua a validação e a encriptação(Triple
DES) dos dados para proteger o cookie; - None
– A validação e a encriptação estão
desabilitadas; - Encryption
– Define que o cookie vai ser criptografado
usando Triple DES ou DES sem efetuar a
validação; - Validation
– Faz a validação e não efetua a encriptação
do cookie.
- All
O
algorítmo DES(Data Encryption Standard)
foi criado em 1977, sendo largamente usado desde então.
Foi adotado pelo National Bureau of Standards,
atualmente conhecido como National Institute of Standards
and Technology. Seu funcionamento básico consiste na
criptografia de blocos de 64 bits de entrada com uma
chave de 56 bits, gerando blocos de 64 bits como saída.
Para obter o texto original novamente, reverte-se o
processo usando a mesma chave. Devido ao pequeno tamanho
desta, esse algoritmo já não é considerado seguro,
pois ele poderia ser quebrado com certa facilidade pela
força bruta.
O
3DES(Triplo DES), sigla para Triple Data
Encryption Standard, é um padrão de criptografia
baseado no algoritmo de criptografia DES
desenvolvido pela IBM em 1974 e adotado como padrão em
1977. 3DES usa 3 chaves de 64 bits (o tamanho máximo
da chave é de 192 bits, embora o comprimento atual seja
de 56 bits). Os dados são encriptados com a
primeira chave, decriptado com a segunda chave e
finalmente encriptado novamente com a terceira chave.
O parâmetro <credentials>
possui os atributos:
- passwordFormat
– Indica a formatação da senha que será armazenada. Os
valores válidos são : Clear, SHA1 e MD5; - User – Usado
para definir as credenciais de nome e senha do usuário. (Você
pode usar a função HashPasswordForStoringInConfigFile
para encriptar a senha).
Além disso, podemos definir
como será a autorização usando a tag <authorization>:
<!-- definindo a autorização-->
<authorization>
<deny users="?"/>
</authorization>
</system.web>
deny
users=”?” -> indica que estamos
negando o acesso a todos os usuários anônimos ou não
autenticados.
Os atributos da tag são: deny
| allow -> Torna possível negar(deny) ou permtir(allow)
o acesso a um recurso aos usuários.
- deny | allow
users = “?” – Indica usuários anônimos ou
não autenticados; - deny | allow
usres = “*” – Indica indica todos os usuários.
Além disso, podemos usar a
tag <location> para indicar um recurso
sobre o qual vamos permitir ou negar o acesso. Veja este exemplo:
<!-- Definindo a restrição de acesso a pasta Admin-->
<location path="Admin">
<system.web>
<authorization>
<allow users="?"/>
</authorization>
</system.web>
</location>
</configuration>
Obs:
a tag <location> fica fora da tag <sistem.web>.
Abaixo vemos o arquivo web.config
completo contendo todos os itens de configuração definidos:
Após essa pequena
recapitulação dos conceitos sobre os parâmetros e atributos
usados para realizar a autenticação e a autorização, vamos ao
nosso assunto principal que será implementar a autenticação e
a autorização para usuários com perfis distintos.
Definindo
o cenário
Vamos supor que você tenha
que desenvolver uma aplicação ASP .NET onde deverá realizar a
autenticação/autorização dos usuários sendo que os usuários
poderão ter os seguintes perfis:
- Usuários
Administradores – perfil = admin -> Acesso a
área de administração; - Usuários
Funcionários – perfil = funci -> Acesso a
área de funcionalismo; - Usuários Professores
– perfil = mestre -> Acesso a área dos
professores; - Usuários Alunos –
perfil = aluno -> Acesso a área dos alunos.
O seu objetivo é
identificar no login de cada usuário qual o perfil atribuído a
ele, e, conforme o perfil, permitir o acesso a determinados
recursos da aplicação (páginas,arquivos,etc.).
Os recursos usados para
criar o exemplo deste artigo são:
- Visual
Web Developer 2010 Express Edition; - SQL
Server 2005 ou 2008 Express Edition; (neste exemplo não vou
usar um banco de dados apenas indicar como criar a rotina
para acessar o banco).
Com isso posto, vamos ao
trabalho…
Criando
o projeto no VWD 2010
Abra o Visual Web Developer
2010 Express edition e crie um novo projeto (File->
New Project) do tipo ASP .NET Empty Web
Application com o nome
Será criado um projeto
contendo apenas o arquivo web.config vazio e a pasta My
Project.
Clique com o botão direito
do mouse sobre o nome do projeto e selecione a opção Add
-> New Folder e crie as pastas Admin
e Aluno.
Em seguida, vamos definir no
arquivo web.config os parâmetros para ativar a
autenticação/autorização via formulário e definir os perfis
e respectivos acessos conforme a figura abaixo:
<?xml version="1.0"?>
<configuration>
<system.web>
<compilation debug="true" strict="false" explicit="true" targetFramework="4.0" />
<forms name="login" loginUrl="login.aspx">
<credentials passwordFormat="Clear">
<user name="macoratti" password="123456"/>
<user name="batman" password="123456"/>
</credentials>
</forms>
</authentication>
<authorization>
<allow roles="aluno" />
<allow roles="funci" />
<allow users="admin" />
<allow users="mestre"/>
<deny users="*" />
</authorization>
</system.web>
<!-- Definindo a restrição de acesso a pasta Admin-->
<location path="Admin">
<system.web>
<authorization>
<deny users="*"/>
</authorization>
</system.web>
</location>
<!-- Definindo a restrição de acesso a pasta Aluno-->
<location path="Aluno">
<system.web>
<authorization>
<deny users="?"/>
</authorization>
</system.web>
</location>
</configuration>
Na próxima semana, na segunda parte deste artigo, veremos as páginas, as pastas e o
código que teremos que implementar para realizar a nossa missão
impossível…
Eu sei, é apenas ASP .NET, mas eu gosto…