WebMatrix Gerenciando a Segurança (I)

Neste artigo aprenderemos como utilizar os mecanismos de segurança que ASP.NET WebPages nos oferece e como podemos utilizá-los a partir de WebMatrix.

Por Javier Holguera - Tradução de Celeste Veiga


Publicado em: 22/1/13
Valorize este artigo:
Este é o primeiro dos artigos dedicados à segurança no desenvolvimento baixo WebMatrix, que estamos vendo dentro do Manual de Microsoft WebMatrix.

Nesta primeira parte veremos como criar a infraestrutura para registrar usuários, ou seja, criar a tabela na base de dados e o formulário de registro de usuários. Na segunda parte dedicada à segurança, repassaremos de que forma podemos nos autenticar y autorizar com base nestes mecanismos.

1. Criar base de dados de usuários

Antes de pretender realizar qualquer classe de autenticação, é necessário que tenhamos uma base de dados contra a que poder realizar esta operação. Nela deveremos salvar informação sobre os usuários e seus papéis, para poder autorizar certas ações em função de pertencer o usuário a eles.

Em WebMatrix não pode ser mais simples criar esta base de dados. WebSecurity é o helper que nos vai acompanhar durante este e o artigo seguinte, peça central sobre a que gira toda a segurança. Esta classe nos oferece um método chamado InitializeDatabaseConnection, que servirá para definir as tabelas que respaldarão nosso sistema de segurança.

Esta chamada só pode ser feita uma vez e deve ser feita antes que qualquer outro processo de carregamento, por razões óbvias. Porém, onde poderíamos realizá-la para nos assegurarmos de que não se realiza mais de uma vez e que as tabelas estejam prontas antes de estar, praticamente, a própria aplicação? A resposta é simples: no arquivo _AppStart.cshtml.

Este arquivo permite definir processos e ações que queiramos que se realizem antes de que seja executada qualquer página web, permitindo-nos estabelecer valores globais (como poderiam ser chaves compartilhadas por todas as páginas) ou executar processos que são necessários antes de iniciar a aplicação, como este que estamos explicando.

Para isso, acrescentaremos uma nova página _AppStart.cshtml na pasta raiz de nosso projeto e introduziremos nela o seguinte fragmento de código:

@{
    WebSecurity.InitializeDatabaseConnection(
       "Meu Blog", "Usuario", "UsuarioId", "Nome", true);
}

Vamos analisar cada um dos parâmetros que passamos a esta chamada:

  • O primeiro é o nome da base de dados onde vão ser criadas as tabelas relacionadas com a segurança.
  • O segundo é o nome da tabela que vai conter os usuários
  • O terceiro é o nome da coluna que vai servir de identificador para cada fila
  • O quarto é o nome da coluna que vai conter o nome do usuário.
  • O quinto nos serve para indicar à chamada que deve criar as tabelas por nós. No caso de que já tenhamos umas tabelas para a segurança de nossa aplicação, devemos passar "false" neste parâmetro.
Uma vez executada corretamente esta sentença, vamos poder ver mediante o espaço de trabalho de "Databases" que há quatro tabelas novas em nossa base de dados. O diagrama seguinte mostra estas tabelas e seus campos:

Como vemos, foi criada uma tabela Usuario. Esta tabela poderia ser uma tabela que utilizáramos para armazenar informação extra sobre cada uno de nossos usuários, como endereços de correio, físicas, dados pessoais, etc. Está conectada com a verdadeira tabela de usuários, desde o ponto de vista da segurança, que é a tabela Membership que contém um bom número de campos relacionados com a senha e sua gestão.

Também se cria uma tabela "Roles", para poder gerenciar em que papéis queremos ter nossos usuários e poder dar acesso ou não a recursos e operações em função de seu pertencer. Ambas tabelas estão conectadas através da tabela intermediaria UsersInRoles. É, em conjunto, um modelo simples e facilmente compreensível.

2. Registrar usuários

Já temos nossa base de dados pronta para armazenar novos usuários e nos permitir posteriores operações de autenticação e autorização. No entanto, o primeiro será facilitar aos visitantes do nosso website registrarem-se como usuários. Para isso, deveremos criar uma página "Registrar.cshtml" a partir da qual os usuários possam introduzir seu nome e sua senha. Um exemplo de código, o mais simples possível, seria o seguinte:

@{
   if(IsPost)
   {
       var sentencaInsercao = "INSERT INTO Usuario (Nome) VALUES (@0)";
       var db = Database.Open("Meu Blog");
       db.Execute(sentencaInsercao, Request["nomeusuario"]);
       WebSecurity.CreateAccount(Request["nomeusuario"], Request["password"]);
   }
}

<form method="post" action="">
    <fieldset>
       <legend>Registrar se como usuario</legend>
          <div>
             <label for="nomeusuario">Nome:</label>
             <input type="text" name="nomeusuario" value="@Request["nomeusuario"]"/>
          </div>
       <div>
       <label for="nomeusuario">Chave:</label>
       <input type="password" name="password" value="@Request["password"]"/>
       </div>
    </fieldset>
<div><input type="submit" value="Registrar se" /></div>
</form>

O código HTML é suficientemente simples para não necessitar de maiores comentários. Quanto ao código na parte superior, podemos ver que se realizam duas operações. Em primeiro lugar, se insere o novo usuário na tabela Usuario. Uma vez que já tenhamos uma nova fila em Usuario poderemos dar início a registrar em nossas tabelas de segurança, com a chamada WebSecurity.CreateAccount, à que lhe passaremos o nome e a senha.

Também podemos passar a esta chamada um booleano para indicar se queremos que o usuário não seja efetivo até estar confirmado. No caso de fazê-lo desse modo, a chamada a WebSecurity.CreateAccount nos devolverá um token. Seria necessário enviar esse token por correio ao usuário que acaba de se registrar, para que posteriormente procedesse a confirmar o registro passando, à página correspondente, esse token e realizando nós uma chamada WebSecurity.ConfirmAccount com o token como único parâmetro. Entretanto, em aras da simplicidade, vamos deixar o registro assim, sem necessidade de realizar uma posterior confirmação com esse token.

3. Conclusões

Vimos como criar o esquema de base de dados que vai dar suporte a nossas operações de segurança, assim como a forma de criar novas contas de usuário neste sistema. No artigo seguinte abordaremos as outras duas operações fundamentais na segurança: autenticação e autorização.

1. Autenticar- se

No artigo anterior aprendemos como registrar novos usuários. Uma vez feito isso, o passo seguinte é permitir que se autentiquem em nossa aplicação para dar a eles acesso a maiores privilégios. Para isso, criaríamos uma página "Logar.cshtml" para proceder à autenticação que poderia ter um código como o seguinte:

@{
if(IsPost)
{
if(WebSecurity.Login(
Request["nomeusuario"], Request["password"]) == true)
{
<text>Usuario autenticado</text>
}
else
{
<text>Autenticação falida</text>
}
}
}

<form method="post" action="">
<fieldset>
<legend>Logarse como usuario</legend>
<div>
<label for="nomeusuario">Nome:</label>
<input type="text" name="nomeusuario"
value="@Request["nomeusuario"]"/>
</div>
<div>
<label for="nomeusuario">Chave:</label>
<input type="password" name="password"
value="@Request["password"]"/>
</div>
</fieldset>
<div><input type="submit" value="Logar" /></div>
</form>

A parte do código HTML é praticamente idêntica à que vimos no artigo anterior. Quanto ao código de procedimento, se realiza uma chamada ao método Login do helper WebSecurity. Este método aceita como parâmetros o nome de usuário e a senha, mais um parâmetro opcional de tipo booleano que serve para indicar se queremos que a aplicação web nos lembre, mediante o estabelecimento de uma cookie.

A chamada retornará um booleano para nos indicar se fomos corretamente autenticados. Como vemos, mediante as etiquetas "" podemos definir uma mensagem diretamente no código HTML da página, com um resultado como o que pode ser visto na seguinte figura:

Com isto completaríamos a funcionalidade necessária para realizar autenticações, mas nos faltaria a parte da autorização, ou seja, assegurar-nos de que um usuário têm as permissões necessárias para poder acessar um recurso ou funcionalidade. Vejamos como fazê-lo.

2. Autorização

O processo habitual de autorização consiste em três passos:
  1. Comprovar as credenciais. Se existem, se dá acesso ao recurso.
  2. Se não existem as credenciais, se pede ao usuário que se autentique.
  3. Se redirige a uma página de forma automática para que possa autenticar-se.
  4. Uma vez que foi autenticado corretamente, se redirige ao recurso que inicialmente queria acessar.
Vejamos como podemos reproduzir este processo com WebMatrix. Em primeiro lugar, necessitaríamos uma página para fazer a autenticação como a que críamos antes. Em segundo lugar, necessitaríamos criar uma página que tivesse controle de acesso. Vamos acrescentar uma página "Comentar.cshtml" que permita deixar um comentário em um post. Para poder comentar, vamos requerer que o usuário esteja autenticado. Uma primeira aproximação ao código seria algo assim:

@{
if (WebSecurity.IsAuthenticated == false)
{
Response.Redirect("/Logar?UrlRetorno=/Comentar");
}
else
{
if(IsPost)
{
/* Inserir em BD o comentario */
var db = Database.Open("Meu blog");
string sentencaInsercao =
"INSERT INTO Comentario (Autor, Conteudo, Data, PostId) VALUES (@0, @1, @2, @3)";
db.Execute(
sentencaInsercao,
WebSecurity.CurrentUserName,
Request["comentario"],
DateTime.Now.ToString(),
Request["postid"].AsInt());
}
}
}

<form method="post" action="">
<fieldset>
<legend>Comentar o post</legend>
<div>
<label>Post ID</label>
<input type="text" name="postid"
value="@Request["postid"]" />
         </div>
<div>
<label>Comentario</label>
<textarea name="comentario" rows="15" cols="40"
value="@Request["comentario"]"></textarea>
</div>
</legend>
</fieldset>
<div><input type="submit" value="Comentar" /></div>
</form>
No código HTML acumulamos os dois dados que necessitamos: o identificador do post ao que vamos lincar o comentário e o conteúdo do comentário. Poderíamos não requerer este identificador se lincássemos a página de comentários a partir da página do post, mas não é objeto deste artigo entrar neste tipo de complexidades.

Quanto ao código de procedimento, podemos ver que o primeiro passo é comprovar se o usuário está autenticado. Se não estiver, se realiza um redirecionamento automático para a página de Logueo, passando como parâmetro a URL à que queremos que se retorne uma vez que se tenha completado satisfatoriamente a autenticação.

No caso do usuário estar autenticado e tenhamos chegado à página por HTTP-POST (por exemplo, depois de pressionar o botão de "Comentar", introduzimos o comentário na base de dados. Destacar que utilizando o helper WebSecurity temos acesso a muita informação sobre o contexto de segurança. Alguns dos métodos mais destacados seriam:

  • WebSecurity.ChangePassword: nos permite trocar o password para um usuário determinado.
  • WebSecurity.CurrentUserId y WebSecurity.CurrentUserName: nos retorna o id e o nome do usuário atualmente autenticado.
  • WebSecurity.Login y WebSecurity.Logout: como seu nome indica, autentica ou reverte a autenticação do usuário, voltando a ser um usuário anônimo.

3. Conclusões

Vimos uma panorâmica geral de como gerenciar o registro de usuários e sua autenticação e autorização, de uma forma simples e rápida. Este tipo de código de infraestrutura costuma nos afastar do que realmente nos importa, o desenvolvimento de nossas aplicações web, fazendo-nos perder tempo em afinar um sistema que seja versátil e robusto.

No entanto, com WebMatrix podemos acessar um sistema de segurança que cumpre com a maioria de nossos requisitos, sem esforço. E não nos esqueçamos de que debaixo está correndo ASP.NET, uma tecnologia tão potente quanto segura.






Usuários :    login / registro

Manuais relacionados
Categorias relacionadas
O autor

Home | Sobre nós | Copyright | Anuncie | Entrar em contato