Autenticação em ASP.NET Enrique Pimentel Leite de Oliveira [email protected] Introdução Segurança de sistemas Web é um assunto complexo e muitas vezes confuso, porém necessário. Esse tipo de segurança envolve validação das credencias de usuários (autenticação) e permissão de acesso aos recursos (autorização). Em ASP .NET, existem diversas formas de implementar segurança em páginas Web. Autenticação e Autorização A autenticação e a autorização devem ser configuradas de forma correta para que a segurança da aplicação Web funcione adequadamente. A autenticação é o processo de identificação do usuário que está requisitando a informação. O usuário é identificado por uma credencial, normalmente um nome de usuário e uma senha. O objetivo da autenticação é garantir que a pessoa é quem está dizendo que é. Se a autenticação falhar (credenciais inválidas) o acesso será negado a um usuário desconhecido Por outro lado, se a credencial for válida o acesso será permitido. Uma vez fornecida a identificação do usuário, o sistema definirá quais recursos poderão ser acessados. Esse processo conhecido como autorização, visa estabelecer níveis de acesso aos recursos. Processo típico de Segurança Credenciais do usuário Não Autenticado? Sim Tenta acessar o recurso Acesso Negado Não Autorizado? Sim Acesso ao recurso Configurando a aplicação Web A configuração da autenticação e autorização no ASP .NET é realizado no arquivo web.config e, quando necessário nas configurações do IIS. Atenção: Erro na configuração do web.config podem causar erros inesperados na aplicação. Autenticação A sintaxe da tag <authentication>, utilizada para configurar a autenticação é: <authentication mode="Windows|Forms|Passport|None"> <forms name="name" loginUrl="url" protection="All|None|Encryption|Validation" timeout="30" path="/" requireSSL="true|false" slidingExpiration="true|false"> <credentials passwordFormat="Clear|SHA1|MD5"> <user name="username" password="password"/> </credentials> </forms> <passport redirectUrl="internal"/> </authentication> Autorização A sintaxe da tag <authentication>, utilizada para configurar a autenticação é: <authorization> <allow users="comma-separated list of users" roles="comma-separated list of roles“ verbs="comma-separated list of verbs"/> <deny users="comma-separated list of users“ roles="comma-separated list of roles“ verbs="comma-separated list of verbs"/> </authorization> Autorização Subtag Descrição <allow> Permite acesso aos recursos basedo em: users: Uma lista sepadara por vígula de nomes que estão autorizados à acessar os resursos. Um ponto de interrogação (?) permite usuários anônimos; um asterisco (*) permite todos os usuários. roles: Uma lista separada por vírgulas de regras que dão acesso aos recursos. verbs: uma lista separada por vírgulas de métodos de transmissão HTTP que podem ser utilizados para acessar os recursos. Os Verbs registrados para o ASP.NET são GET, HEAD, POST, e DEBUG. <deny> Impossibilita o acesso aos recursos basedo em: users: Uma lista separada por vírgulas de nomes de usuários que não têm acesso ao recurso. Um ponto de interrogação (?) indica que usuários anônimos não tem acesso; um asterísco (*) indica que todos os usuários não tem acesso. roles: Uma lista separada por vírgulas de regras que não permitem acesso aos recursos. verbs: uma lista separada por vírgulas de métodos de transmissão HTTP que não podem ser utilizados para acessar os recursos. Os Verbs registrados para o ASP.NET são GET, HEAD, POST, e DEBUG. Provedores de autenticação O ASP.NET fornece 4 provedores de autenticação: None – Sem autenticação Forms – Confia em logon via formulário e cookies Passport – Serviço de autenticação centralizado provido pela Microsoft Windows – baseado na autenticação do Windows, o IIS cuida da autenticação O provedor é especificado no arquivo Web.config <!-- web.config file --> <authentication mode = "[Windows|Forms|Passport|None]"> </authentication> Autenticação Passport Este é um serviço de autenticação centralizado provido pela Microsoft que oferece um único logon e serviços específicos para os sites ASP.NET participantes, em conjunto com o Microsoft® Passport software development kit (SDK), provê funcionalidades semelhantes a autenticação Forms para usuários do Passport. Autenticação Windows Este provedor utiliza as potencialidades de autenticação do IIS. Depois que o IIS completa sua autenticação, ASP.NET usa a credencial da identidade autenticada para autorizar o acesso. Autenticação Forms Com este provedor requisições não autenticadas são redirecionada para um formulário HTML especificado. O usuário pode então fornecer as credenciais necessárias, e enviar o formulário de volta para o servidor. Se a aplicação autenticar a requisição (usando lógica específica de aplicação), o ASP.NET emite um cookie que contém as credenciais ou uma chave para readquirir a identidade do cliente. Requisições subseqüêntes são emitidas com o cookie no cabeçalho da requisição, significando que autenticações subseqüêntes são desnecessárias. Autenticação Forms Uma interface de usuário personalizada aceita credenciais do usuário Autenticação é efetuada de acordo com um banco de dados usando código próprio, por exemplo. Cliente Requisição: Bemvindo.aspx Servidor Web Resposta: Login.aspx Requisição: Login.aspx + dado Resposta: Bemvindo.aspx + Cookie Usuário autenticado Autenticação Forms O processo para autenticação via Forms é: 1. Um cliente faz um requisição à página segura; 2. Se a requisição não conter um cookie de autenticação válido, o Web Server redireciona o usuário para a URL especificada no atributo loginUrl da tag Authentication no arquivo web.config; 3. Credenciais são fornecidas no ofrmulário e enviadas via método post; 4. Se as credenciais forem válidas (isso pode ser determinado de diferentes formas), o ASP.NET cria um cookie de autenticação no cliente; 5. O usuário pode, então ser redirecionado de volta à página inicialmente requisitada. Autenticação Forms IIS Requisição cliente Permissão ASP.NET Sim Não Cookie autorizad o? Redireciona para página de login Usuário fornece as credenciais Acesso permitido Acesso Negado Não Sim Cria o cookie Autenticado? Autenticação Forms Configurações necessárias para autenticação do tipo Forms. <configuration> <system.web> <authentication mode="Forms"> <forms name="401kApp" loginUrl="/login.aspx"></forms> </authentication> </system.web> </configuration> O exemplo acima configura um site com autenticação baseada em formulário, especificando o nome do cookie e a págian de login, utilizada se a autenticação inicial falhar. Autenticação Forms Quando a autenticação do tipo Forms é utilizada, torna-se necessário impedir o acesso de usuários não autorizados (caso contrário, por que ativar a autenticação do tipo Forms?). Para isso utiliza-ses a tag <authorization>: <configuration> <system.web> <authentication mode="Forms"> <forms name="401kApp" loginUrl="/login.aspx"></forms> </authentication> <authorization> <deny user=“?” /> <!-- acesso negado a usuário anônimos !--> </authorization> </system.web> </configuration> Autenticação Forms Para utilizar as configurações realizadas no web.config, deve-se criar: 1. Página de login (default.aspx), contendo dois Textbox (usuário e senha) e um botão para autenticação; 2. Uma página (restrito.aspx) com um label para testar se a autenticação está funcionando. Autenticação Forms Código para autenticação do usuário (no evento click do botão de login): if (txtUsuario.Text == “nome” && txtSenha.Text == “1234”) { FormsAuthentication.SetAuthCookie(txtUsuario.Text, false); Response.Redirect(“restrito.aspx”); } else //Exibir mensagem de erro de autenticação Autenticação Forms Após o usuário digitar suas credenciais, é realizada uma comparação do usuário e senha. Caso sejam iguais, o método SetAuthCookie da classe abstrata FormsAuthentication, cria um cookie com o nome do usuário (primeiro parâmetro). O segundo parâmetro especifica se o cookie será ou não armazenado na máquina do cliente, para eventuais novos acessos. Em seguida o usuário é direcionado para a página restrito.aspx. Se as credenciais forem inválidas, devemos exibir uma mensagem de erro. Autenticação Forms Outro método da classe FormsAuthentication que podemos utilizar para criar o “ticket” que possibilita o usuário acessar áreas restritas é o RedirectFromLoginPage, que cria o cookie exatamente igual ao SetAuthCookie, porém redireciona o usuário a página inicialmente requisitada. Caso a página requisitada seja a de login, esse método redireciona o usuário para a página default.aspx. if (txtUsuario.Text == “nome” && txtSenha.Text == “1234”) { FormsAuthentication.RedirectFromLoginPage(txtUsuario.Text, false); } else //Exibir mensagem de erro de autenticação Autenticação Forms Após realizada a autenticação o usuário terá acesso a todo conteúdo permitido do site. Para finalizar a autenticação do usuário, utiliza-se o método SignOut(), da classe FormsAuthentication, o botão ou link de logout: FormsAuthentication.SignOut(); Esse método remove o cookie de autenticação e força o usuário realizar novo login, caso deseje acessar um recurso restrito novamente. Exercício Criar um sistema (com MasterPage) o qual possua 3 páginas sendo uma delas a de login. Uma das páginas deverá possibilitar que o usuário poste mensagens que deverão ser armazenadas em um cookie. A outra página deverá possibilitar ao usuário visualizar as mensagens gravadas. Na MasterPage deverá existir um link que possibilite ao usuário fazer logout. Bibliografia Autenticação em ASP.NET Linha de Código - ASP.NET Configurando a segurança na sua aplicação Protegendo o Aplicativo ASP.NET e os Web Services Payne, Chris. Teach Yourself ASP.NET in 21 Days, Second Edition. Sams