Esse é o primeiro post de uma série sobre segurança em asp.net. Considero esse tema de extrema importância para qualquer projeto. Pois é a essência de qualquer sistema. Afinal, você não quer que qualquer um tenha acesso a todas as páginas de sua aplicação, certo?

Bem… se fizermos uma rápida pesquisa na net sobre o assunto, iremos achar uma quantidade muito grande de artigos sobre o mesmo. “E para que estou criando mais um post sobre o assunto?”

Apesar da grande quantidade de material, eu sinto falta de algo simples, prático e direto dizendo como implementar a segurança do asp.net.

A intenção deste primeiro artigo é mostrar como utilizar os controles de segurança da tecnologia.

Antes de começarmos de fato a programar, vamos entender alguns conceitos:

1.1 Autenticação

Basicamente, é você informar para o sistema quem é você, e este por sua vez dirá se você é um usuário válido ou não. Existem três modos de autenticação: Form, Windows e Passport.

1.1.1 Form

Você vai informar para o sistema quem é através de login e senha. Ou seja, você vai ter uma página feita especificamente para isso, para o usuário informar quem ele é. Exemplo:

ScreenShot001

1.1.2 Windows

A aplicação irá validar se você é um usuário ou não, através das credencias do Windows (usuário do Sistema Operacional). Exemplo:

ScreenShot002

1.1.3 Passport

Não iremos falar muito deste modo de autenticação, até porque não é muito utilizada no desenvolvimento de aplicações asp.net. Mas falando rapidamente, foi criada pela Microsoft, onde a idéia principal é que as pessoas teriam um passport no banco da Microsoft, e este daria permissões de acesso aos sites. O benefício é que você não precisaria gravar milhões de usuário e senhas que você possui no mundo da internet.

1.2 Autorização

Depois de ter conseguido acesso ao sistema o que falta?

Bem… A aplicação irá validar quais são as suas permissões no sistema.

Autorização é isto! Informa o que determinado usuário ou grupo de usuário podem ter acesso na aplicação.

Exemplo: Temos um sistema escolar onde apenas os professores podem colocar as notas dos alunos no sistema. Para ter acesso ao portal de alunos, o usuário precisa estar logado como um.

Autenticação: Para acessar o portal de aluno, o usuário precisa informar quem é. E o mesmo precisa ser identificado como um aluno.

Autorização: Apenas professores estão autorizados a colocar notas dos alunos.

1.3 Membership

Em geral, é a classe do .NET responsável pela segurança (valida credenciais e gerencia as configurações dos usuários). Ela encontra-se no namespace System.Web.Security.

Para saber de mais detalhes, acesse o seguinte link:

http://msdn.microsoft.com/en-us/library/system.web.security.membership.aspx

Criando o banco da aplicação

É fato que os usuários, os grupos de usuários, permissões, entre outras regras de segurança precisam ser armazenados em algum local, certo? E onde esses dados são armazenados?

Isso mesmo!!! No banco de dados. Então vamos criar nosso banco no SQL Server 2005.

  1. Abra o SQL Server Management Studio ou o próprio Visual Studio para criarmos nosso banco.
  2. Crie seu banco com o nome de sua preferência (no meu caso coloquei como “DbBlog”).

    ScreenShot003

    ScreenShot004

Pronto!!! Nosso banco e “toda” a nossa estrutura do mesmo já esta criada.

- “Ham? Mas cadê a tabela usuário? a tabela regra? Hum…Está faltando algo, você não acha Felipe?”

Caros Leitores, vamos ter paciência. A estrutura do banco está criada sim, pelo menos a parte que precisamos fazer manualmente. Falta algumas tabelas, mas nós não iremos criá-las na mão. Até porque, para usar os controles do ASP.NET (em modo default) precisamos ter uma estrutura de banco que o ASP.NET reconheça.

Você concorda que iríamos perder muito tempo se fossemos criar todas as tabelas? Sempre que precisássemos criar uma aplicação, iríamos ter o mesmo trabalho de criar uma grande quantidade de tabelas. Bem…Isto é fato!!! E pensando nisso, o pessoal de desenvolvimento do ASP.NET criou uma ferramenta, chamada “REGSQL”, que se propõe a criar automaticamente esta estrutura em nosso banco.

Para utilizar o REGSQL abra o prompt command do visual studio e digite “aspnet_regsql.exe”

ScreenShot005

ScreenShot006

A seguinte tela irá abrir:

ScreenShot007

Pressione “Next”. E a tela seguinte será esta:

ScreenShot008

Selecione a primeira opção caso queira configurar um banco existente ou um novo com informações referentes a segurança.

Selecione a segunda opção caso queira remover as configurações existentes em um banco.

No nosso caso vamos ficar com a primeira opção. Pressione “Next”.

ScreenShot009

Nesta etapa do wizard iremos informa qual o banco que vamos configurar. Informe o server, o modo de autenticação (se vai ser integrada ao windows ou via login e senha) e qual o banco que será configurado. Pressione “Next” –> “Next” –> “Finish”

ScreenShot010

ScreenShot011

ScreenShot012

Agora nosso banco está devidamente configurado!!! A estrutura de seu banco deve estar da seguinte maneira:

ScreenShot014

Configurando a aplicação ASP.NET

Depois do banco já estar corretamente configurado, vamos para o lado da aplicação.

  1. Crie um novo “web site”.
  2. Crie uma nova pasta em seu projeto chamada de “security”. Apenas as pessoas logadas poderão acessar esta pasta.
  3. Adicione uma página .aspx à pasta “Security”.
    ScreenShot015
  4. Crie um novo arquivo no diretório raiz da aplicação chamada de “Login.aspx” (Essa será a página de login do usuário).
    ScreenShot016
  5. Na toolbox procure pela aba “Login”
    ScreenShot018
  6. Arraste o controle “Login” para a sua página “Login.aspx”
    ScreenShot019
  7. Vamos deixar os arquivos desta maneira e vamos configurar o web.config agora. Abra-o.
  8. Adicione a string de conexão que irá apontar para o banco no web.config (Caso não saiba o que é string de conexão e nem do que ela é composta, recomendo ler o meu post que fala sobre acesso a dados em c#://www.devmedia.com.br/articles/viewcomp.asp?comp=11748)
    
    1: <connectionStrings>
    2:   <add name="csBdBlog" connectionString="Data Source=.\SQL;Initial Catalog=DbBlog;Integrated Security=true;" providerName="System.Data.SqlClient"/>
    3: </connectionStrings>
  9. Vamos definir agora como irá ocorrer a autenticação.
    Em <system.web> temos uma tag chamada <authentication> que tem o papel de informar o modo entre outras configurações da autenticação.
    Dentro da tag “authentication” iremos informar alguns dados da autenticação Form, através da tag “forms”. Ficando desta maneira nosso trecho de código:
    
    1: <authentication mode="Forms">
    2:   <forms  name=".APP" loginUrl="~/Login.aspx"></forms>
    3: </authentication>

    Onde “name” é o nome do Cookie que será criado para armazenar dados do usuário. “LoginUrl” é a URL a qual o usuário será redirecionado caso tente acessar uma página que não tenha permissão.
  10. Agora precisamos informas dados da autorização. Ou seja, após o usuário estar logado, o que ele vai poder ver? ou o que ele não via poder ver?
    Fora de “system.web” iremos adicionar o seguinte trecho de código:
    
    1: <location path="Security">
    2:     <system.web>
    3:       <authorization>
    4:         <deny users="?"/>
    5:       </authorization>
    6:     </system.web>
    7:   </location>

    Obs: O código informa basicamente que os usuários anônimos (?) não poderão acessar a pasta Security.
  11. Para finalizar as configurações do Web.Config, temos que adicionar a tag “<membership>”. A possibilidade de customização é imensa. Então irei demonstrar como está o meu código e em seguida comentamos o mesmo.
    
    1: <membership defaultProvider="blogProvider" userIsOnlineTimeWindow="20">
    2:       <providers>
    3:         <remove name="AspNetSqlProvider"/>
    4:         <add name="blogProvider"
    5:              type="System.Web.Security.SqlMembershipProvider"
    6:             connectionStringName="csBdBlog"
    7:              enablePasswordRetrieval="false"
    8:              enablePasswordReset="true"
    9:              requiresQuestionAndAnswer="true"
    10:              passwordFormat="Hashed"
    11:              applicationName="/"/>
    12:       </providers>
    13:     </membership>
    14:   

    • “connectionStringName” – Nome da string de conexão que aponta para o banco que está devidamente configurado com o “regsql”
    • “enablePasswordRetrieval” – Informa se o password poderá ser recuperado.
    • “enablePasswordReset” – Se o password poderá ser resetado.
    • “requiresQuestionAndAnswer” – Sabe quando você vai se cadastrar em algum site, e em um dado momento ele pede uma pergunta e uma resposta secreta? É a intenção deste elemento. Informa se essa pergunta e essa resposta vão fazer parte do formulário de cadastro do usuário.
  12. Ótimo!!! Finalizamos as configurações no web.config. Vamos para o próximo passo.

Ferramenta ASP.NET Configuration

Em ASP.NET temos uma ferramenta que nos permite fazer algumas configurações administrativas de nosso site, como cadastrar usuário, remover usuário, adicionar grupo, remover grupo…

Para acessar esta ferramenta, localize no menu o item “website” –> “ASP.NETconfiguration”.

ScreenShot020

ScreenShot021

Na tela que apareceu escolha a aba “Security”

ScreenShot022

Nessa aba, podemos gerenciar os usuários e regras de acesso. Vamos criar um usuário qualquer para servir de teste em nossos exemplos.

ScreenShot023

ScreenShot024

ScreenShot025

Ok. Para esse exemplo já podemos fechar a página do “ASP.NETconfiguration”.

Testando o que já foi feito

Depois de configurar o nosso banco, o web.config e criar um usuário qualquer, chegou a hora de testar o que fizemos até o dado momento.

Tente rodar a página que está dentro da pasta “security” e veja o que acontece:

ScreenShot026

E a página que aparece é a Login.aspx, pois não temos acesso as páginas que estão dentro de “security”. Pois até o dado momento estamos anônimos. Temos que nos identificar.

ScreenShot028

ScreenShot029

Se identifique e note para que página ele irá nos redirecionar

ScreenShot030

Agora sim temos acesso as páginas que não tínhamos acesso anteriormente.

ScreenShot031

Os Outros controles de Login

Depois de tudo configurado, a utilização dos controles fica trivial. É questão apenas de soltar os controles na tela.

Para fechar, vamos falar de alguns controles de Login RAPIDAMENTE. Deixo com vocês a tarefa de estudar detalhadamente cada componente desse.

6.1. Create User

Wizard para cadastrar usuários. Para utilizá-lo, arraste e solte na página desejada.

ScreenShot032

ScreenShot033

Login Status

Controle do tipo Link que dependendo do estado que você se encontra (anônimo ou logado) ele exibe a mensagem de “login” (redirecionar para página de login) ou de “log out” (finaliza sessão do usuário).

ScreenShot034

ScreenShot035

ScreenShot036

6.3 Login View

Esse controle é muito útil. Ele pode assumir dos comportamentos diferentes de acordo com o seu status. Ou seja, ele tem dois templates, um para quando o usuário está anônimo e o outro para quando está logado no sistema.

ScreenShot037

ScreenShot038

ScreenShot039

ScreenShot040

6.4 Login Name

Exibe na tela o nome do usuário logado.

ScreenShot041

ScreenShot042

6.4 Change Password

Wizard que possibilita a troca de senha de um determinado usuário.

ScreenShot043

ScreenShot044

6.5. Recovery Password

Possibilita que o usuário recupere sua senha através de seu email.

ScreenShot045

ScreenShot046

Finalizando

Neste primeiro artigo da serie vimos como implementar de maneira simples e prática segurança em nossas aplicações ASP.NET através dos controles já existentes no ASP.NET.

Abraço a todos!!!