You are on page 1of 19

Pesquisar DevBrasil Procurar

Registre-se
Acessar
DevBrasil
Prazer em desenvolver software
Incio
Cursos Online
Dvidas
Minha pgina
Bate-papo
Todas as mensagens do blog
Meu blog
Adicionar
Autenticao e Permisses de usurios em ASP.NET MVC 4
Postado por Renan Cunha em 29 dezembro 2011 s 22:30
Exibir blog
Neste artigo iremos ver uma maneira eficiente de autenticar usurios e definir permisses para os mesmos, ou
seja, quais locais de uma aplicao (em ASP.NET MVC 4) o usurio poder acessar. A autenticao e as permisses
sero feitas a partir de informaes contida em um banco de dados. Para desenvolver o exemplo do artigo estarei
utilizando o Visual Web Developer 2010 (Visual Studio 2010), um banco de dados (SQL Server 2008) e o Entity
Framework 4.1.
Importante
Porm o foco do artigo no ser ensinar o bsico do MVC e nem a integrao da aplicao com o banco de dados. O
foco ser totalmente voltado para a questo da autenticao. interessante que o leitor j tenha um conhecimento
prvio sobre o framework ASP.NET MVC para que no fique perdido.
Eu irei disponibilizar o download de uma aplicao bsica, e ns iremos implementar nela um controle de login e
depois definir os locais que um dado usurio poder acessar.A estrutura dessa aplicao que iremos tomar como
ponto de partida a seguinte:
(O download da aplicao que usaremos est no final do artigo)
Imagem 1 - Estrutura bsica da aplicao
Bom, primeiro importante entendermos a lgica utilizada para modelar o banco de dados utilizado.
Imagem 2 - Estrutura do banco de dados
Podemos ver que a relao entre Usurios e Permisses uma relao de muitos para muitos, pois um usurio
pode ter vrias permisses, e uma permisso pode pertencer a vrios usurios. O Entity Framework j mapeou essa
relao entre as entidades, como pode ser visto ali, o Usuario possui uma lista de Permissoes e vice-versa.
Autenticao
Para iniciarmos, crie um novo diretrio no nosso projeto, chamado Repositories. nele que iremos guardar os repositrios da aplicao, que nada
mais so do que classes que iro manipular a parte de dados da aplicao. Criado o diretrio, crie dentro dele uma classe chamada
UsuarioRepositorio, que ser o repositrio de Usurios, nele que iremos implementar funcionalidades, como o mtodo que ir tentar autenticar
uma pessoa entre outros. (Que fique claro aqui que essa maneira como estou criando os diretrios, trabalhar com repositrio, uma opinio
pessoal, cada um desenvolve da maneira que achar mais organizada, se voc preferir organizar a estrutura de outra maneira no tem problema
algum. Feito os passos acimas deveremos ter algo como a imagem abaixo:
Imagem 3 - Novo repositrio
Agora abra a nova classe criada "UsuarioRepositorio", e vamos implementar alguns mtodos e propriedades nela. Primeiramente iremos criar um
mtodo esttico chamado AutenticarUsuario que receber como parmetro duas strings, uma o Login e a outra a Senha. O resultado final
ser esse:
Imagem 4 - Cdigo para autenticar o usurio
O cdigo acima se auto-explica facilmente. Primeiro ns verificamos se os dados informados realmente existem no
banco de dados e se pertencem, caso se obtenha sucesso, setado o cookie de autenticao. O prximo passo
agora criamos um mtodo esttico que ir retornar o Usuario que est logado, caso existir um usurio logado
claro. O cdigo final desse outro mtodo ser o seguinte:
Imagem 5 - Cdigo para buscar o usurio logado
O cdigo acima tambm simples, ele apenas verifica se existe algum usurio logado (existncia do cookie
encriptado), caso exista ele faz uma busca no banco de dados e retorna um objeto Usuario.
Vamos implementar tambm no repositrio Usurio, um mtodo que ir desfazer a autenticao, ou seja, vai
"Deslogar". Ele bem simples:
A prxima etapa agora implementar a autenticao na hora que usurio tentar logar. Se voc verificar, no
controlador "UsuarioController" j existe o ambiente preparado para exibir a pgina de login, e tambm para tratar
o processamento lgico, que quando o usurio envia o formulrio preenchido. Na aplicao que estamos usando
como base, j est criado o View para o usurio fazer o login. A URL dessa pgina de login por conveno
"/Usuarios/Logar", pois o nome do controller Usuarios e o do mtodo Logar.
Abra a classe "UsuarioController", que se encontra no namespace Controllers da aplicao. V at o mtodo "public
ActionResult Logar(UsuarioLogin_M model)". aqui que iremos disparar aquele mtodo esttico "AutenticaUsuario"
que criamos l no repositrio do Usuario. Observe como ficar o cdigo:
Imagem 6 - Cdigo disparado quando o usurio tenta logar
Se voc executou todas etapas corretamente, rode a aplicao e vamos testar, para ver se o login est funcionando
corretamente. J existe um usurio de testes cadastrado, os dados para logar nele teste/teste. Se voc conseguiu
efetuar o login e chegou na pgina abaixo, significa que a parte da autenticao est completa.
Imagem 7 - Resultado da autenticao
Permisses
Bem, com a autenticao funcionando, vamos partir para as permisses. Se voc reparar no controller "UsuarioController", no mtodo que retorna o View da pgina que somente
usurios logados podem acessar, existe uma anotao "[Authorize]" nele.
Imagem 8 - Anotao Authorize
A anotao Authorize um recurso do modo que estamos utilizando para autenticar nossos usurios (FormsAuthentication). Todo mtodo que
tiver essa anotao, quando requisitado, passar por uma verificao para ver se existe um usurio logado ou no.
O problema o seguinte, e se ns possuirmos dois tipos de usurios, por exemplo, os usurios comuns e um outro tipo, que seria os
administradores. obvio que os administradores teriam acessos a outras reas do site. Conforme falado l no inicio, o nosso banco de dados foi
estruturado para funcionar desta maneira, com vrios tipos de usurios.
A seguir iremos fazer algumas implementaes para que a anotao Authorize receba as permisses por parmetros. Quando o Authorize
executado, ele busca as "Roles" que seriam no nosso caso, as permisses disponveis para o usurio. O que acontece que como estamos
fazendo isso de uma maneira alternativa, armazenando as permisses em nosso DB, precisamos sobrescrever o mtodo que lista as "Roles" de um
certo usurio.
Para iniciar, ns iremos criar um outro diretrio em nossa aplicao, chamado "Security". Dentro desse diretrio, crie uma nova classe em branco
chamada "PermissaoProvider" e estenda essa classe a classe "RoleProvider" que faz parte do namespace "System.Web.Security". O prximo
passo selecionarmos a opo para que o Visual Studio implemente para ns todos mtodos da classe abstrata "RoleProvider" como mostra a
imagem abaixo:
Imagem 9 - Implementao automtica dos mtodos da RoleProvider
Aps clicar na opo mostrada na imagem, ser criado vrios mtodos em nossa classe, mas apenas um nos interessa no momento. Esse que
nos interessa se chama "GetRolesForUser". Ns iremos sobrescrever ele, esse mtodo o que foi falado acima, ele responsvel por retornar
um array de strings que so as Permisses de um usurio. Veja como ficar o mtodo:
Imagem 10 - Sobrescrevendo o mtodo GetRolesForUser
Bom amigos, agora ns precisamos informar a nossa aplicao, que ns alteramos a classe que fornece as Permisses de um usurio. Iremos
fazer isso modificando ou inserindo uma tag no arquivo de configurao "Web.config".
Abra este arquivo, e procure pela tag <roleManager> e delete ela. Feito isso, insira ela novamente s que informando agora o local da nova
classe que criamos (PermissoesProvider) conforme a imagem abaixo:
Imagem 11 - Alterando o Web.config
O que ns fizemos acima, foi interceptar e alterar o jeito com que as permisses de um usurio so buscadas.
Agora o ultimo passo para se concretizar o processo. Ns iremos sobrescrever um mtodo da classe "AuthorizeAttribute" que a classe
responsvel pela anotao "[Authorize]".
Crie uma nova classe no diretorio "Security" chamada "PermissoesFiltro" e estenda ela a classe "AuthorizeAttribute" que pertence ao
namespace System.Web.Mvc. Feito isso, sobrescreva o mtodo "OnAuthorization(AuthorizationContext filterContext)" conforme a imagem
abaixo:
Imagem 12 - Sobrescrevendo o mtodo OnAuthorization
Ns sobrescrevemos esse mtodo "OnAuthorization" para poder dizer para a aplicao o que fazer quando um acesso for negado.
Agora finalmente, vamos voltar l no Controller "UsuarioController". Delete a anotao "[Authorize]" dele, e vamos implementar nele agora as
permisses do nosso modo.
Vamos supor que a pgina "/Usuarios/Principal" s poder ser acessada por usurios que possuem a permisso de "Gerente". Veja como ficaria a
anotao do mtodo:
Imagem 13 - Configurando as
permisses de uma localizao
E vamos supor novamente, que para o usurio acessar a pgina acima, ele precisa ter duas permisses (Gerente e Avanado). Veja como ficaria
a definio:
Imagem 14 - Duas permisses em uma localizao
Bom pessoal, isso. O artigo ficou meio cansativo pois muita coisa para se tratar, mais o MVC uma forma muito inteligente para trabalhar
com aplicaes web. Espero que meu compartilhamento tenha sido til. Obrigado.
Para saber mais:
Confira outras publicaes sobre este assunto na comunidade ASP.NET
ExemploAutenticacao - Basica.rar
ExemploAutenticacao - Final.rar
Exibies: 11928
Tags: autenticar, autenticao, authentication, authorize, entrar, logar, login, mvc, permissions, permisses, Mais...
Curtir
10 membros curtem isto
Compartilhar Twitter Facebook
Comentar
Voc precisa ser um membro de DevBrasil para adicionar comentrios!
Entrar em DevBrasil
Comentrio de Andr Brito Fernandes da Silva em 11 fevereiro 2014 s 14:12
Na hora de testar ele requisita a pgina Account/Login?
Seria Default do Authorize???
Tem como configurar outro Controller em vez de Account/Login?
Grato...
Comentrio de Rafael Moura em 24 janeiro 2014 s 12:36
4 Curtir
Cara, show de bola! Tenho uma dvida, consigo colocar para expirar a sesso se ficar algum tempo sem acesso ao site (sistema web) ??
Abraos e Parabens!
Comentrio de Aislan Miranda em 29 dezembro 2013 s 15:17
Renan, Muito legal mesmo...apliquei em meu projeto e funcionou perfeitamente! Ressaltando que a segurana primordial em sistemas web.
Comentrio de Cleber Cato em 26 novembro 2013 s 23:16
Parabns pelo post. Gostaria de saber se algum conseguiu o exemplo? Caso positivo, se possvel enviar para souluxferre@gmail.com. Obrigado.
Comentrio de Guilherme De Carvalho Lima em 30 outubro 2013 s 9:18
opa, primeiramente bom dia, e parabns pelo post.
nao consigo baixar os exemplos para seguir o tutorial aqui.
Att.
Comentrio de Claudinei Rodrigues em 2 outubro 2013 s 16:22
Cara, muito legal. Parabns.
Comentrio de Gustavo Adolfo Alencar em 27 setembro 2013 s 15:50
Excelente! Parabns e obrigado.
Comentrio de Jonas C. Nobre em 19 setembro 2013 s 11:29
Parabns! Eu gostaria de saber se algum tem esse cdigo ai? O link indicado est sem o arquivo... Vlw..
Comentrio de Aislan Miranda em 10 setembro 2013 s 15:52
Parabns pelo post! muito boa a explicao!
Comentrio de Fbio Castro em 25 julho 2013 s 17:32
Muito bom tutorial, gostaria de obter os arquivos desse exemplo..Teria como me passar??Estou precisando muito..Vlw
Anterior
1
2
3
4
Prximo
Pgina 2 Ir
RSS
Bem-vindo a
DevBrasil
Registre-se
ou acesse
Or sign in with:
2014 Criado por Ramon Dures.
Badges | Relatar um incidente | Termos de servio
Entrar no bate-papo

You might also like