WebMatrix – segurança e memberShip – Parte 02
Na primeira parte deste artigo, abordei os conceitos do helper WebSecurity e hoje vou mostrar como aplicar esses conceitos criando uma página de registro de usuário.
Na primeira parte deste artigo, abordei os conceitos do helper WebSecurity e hoje vou mostrar como aplicar esses conceitos criando uma página de registro de usuário. Ela seguirá o modelo padrão: irá fornecer um formulário contendo uma caixa de texto com o nome do usuário e outra caixa de texto para informar a senha. Quando o usuário enviar o formulário, vamos verificar se a conta de usuário com este nome ja não existe e se o valor da senha confere.
Se estas duas condições forem atendidas, vamos fazer o log out de qualquer usuário atual, criar a nova conta, e fazer o log in para o novo usuário exibindo uma mensagem de sucesso.
Vamos partir do site SegurancaMembros, criado na primeira parte do artigo. Abra, então, o site SegurancaMembros no WebMatrix, clicando em My Sites e selecionando o site SegurancaMembros:
Vamos incluir uma nova página chamada Registro.cshtml na raíz do nosso site. Clique no item do menu New->New File. A seguir escolha o template CSHTML e informe o nome Registro.cshtml e clique em OK. Em seguida inclua o código abaixo no arquivo Registro.cshtml:
Esta página ao ser executada irá produzir o seguinte resultado:
Precisamos mais que isso para implementar o registro de membros, então, vamos incluir o código no topo da página para ser executado no postback. Este código deverá realizar as seguintes tarefas:
- Fazer o log out de qualquer usuário atual (através do método WebSecurity.Logout());
- Verificar se o nome de usuário enviado no formuluário já não existe (através do método WebSecurity.UserExists).
- Comparar os valores das duas caixas de texto de senha para garantir que eles correspondem.
Finalmente, se toda a validação passou, vamos chamar o método WebSecurity.CreateUserAndAccount() para inserir a nova conta no banco de dados, fazer o login do usuário e devolvê-lo para a página padrão.
O código abaixo a ser incluído é o seguinte:
@{
var username = "";
var password1 = "";
var password2 = "";
if(IsPost)
{
WebSecurity.Logout();
username = Request["username"];
password1 = Request["password1"];
password2 = Request["password2"];
// faz a validação
if (username.IsEmpty()) {
ModelState.AddError("username", "O usuário é obrigatório.");
}
if (password1.IsEmpty()) {
ModelState.AddError("password1", "A senha deve ser informada.");
}
if(WebSecurity.UserExists(username))
{
ModelState.AddError("username", "Uma conta com este nome já existe.");
}
if(password1 != password2)
{
ModelState.AddError("password1", "As senhas não conferem.");
}
// Cria a conta
if(ModelState.IsValid)
{
WebSecurity.CreateUserAndAccount(username, password1, null, false);
WebSecurity.Login(username, password1);
Response.Redirect("default");
}
}
}
No código acima utilizamos quatro métodos do helper WebSecurity:
- Logout() – Este método não aceita parâmetros e simplesmente faz o log out de qualquer usuário atual. Como nenhuma mensagem de erro será mostrada, se chamarmos o método Logout quando não há usuários logados no site, não há necessidade verificarmos isto antes chamá-lo;
- UserExists() – Este método consulta o banco de dados de Perfil e Membros para ver se um existe um registro com o nome do usuário correspondente ao passado no parâmetro. Se um registro for encontrado, o método retorna true, senão retorna falso;
- CreateUserAndAccount()- Cria uma nova conta para o usuário e senha informados;
- Login()- Faz o login para um usuário e senha informados.
Uma vez que temos a certeza de que a conta não existe, passamos ao método CreateUserAndAccount() o nome de usuário e senha da conta a ser criada e, em seguida, chamamos o método Login(), passando novamente o nome de usuário e senha.
Após isso, teremos também que incluir código para exibição do resultado das validações do erros. Começamos definindo um estilo entre as tags <stile> e usamos o @Html.ValidationSummary para exibir os erros.
O método ValidationSummary retorna uma lista não ordenada (elemento ul) de mensagens de validação que estão no objeto ModelStateDictionary. O código HTML da página Default.aspx ficará assim:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<title>Registrar Usuário</title>
<style>
.validation-summary-errors,
span.field-validation-error { color: #FF0000; }
input.field-validation-error { border: 1px solid #FF0000;
background-color: #FFCCCC; }
</style>
</head>
<body>
<h1>Registrar</h1>
@Html.ValidationSummary("Não foi possível criar a conta. Corrija os seguintes erros: ")
<form action="register" method="post">
<div>
@Html.Label("Usuário: ", "username")<br />
@Html.TextBox("username", username)
@Html.ValidationMessage("username")
</div>
<div>
@Html.Label("Senha: ", "password1")<br />
@Html.Password("password1", password1)
@Html.ValidationMessage("password1")
</div>
<div>
@Html.Label("Confirma Senha: ", "password2")<br />
@Html.Password("password2", password2)
</div>
<div>
<input type="submit" value="Registrar" />
</div>
</form>
</body>
</html>
Executando a página Registro.cshtml e tentando submeter o formulário vazio teremos o seguinte resultado:
Quando uma conta for registrada com sucesso, o usuário será redirecionado de volta para página padrão e as linhas contendo a informação da conta serão inseridas nas tabelas UserProfile e webpages_Membership do nosso banco de dados.
Informando o usuário e a senha e clique em Registrar para submeter o formulário teremos a criação da conta do usuário.
Podemos seleciona a guia DataBases e abrir as tabelas do banco de dados MembroExemplo.sdf e verificar os dados gravados:
Observe que a senha é armazenada na tabela webpages_Membership como um hash seguro em vez de texto simples.
Em seguida, vamos criar um helper chamado ResumoConta, que podemos usar para exibir informações de login para o usuário nas páginas do nosso site. Com este helper faremos o seguinte:
- Se nenhum usuário estiver logado no site, ele irá exibir links para o login e para as páginas de registro;
- Se um usuário estiver logado no site, o helper mostrará o nome do usuário atual, que será um link para uma página que permite ao usuário alterar sua senha, e um link para logout.
Para criar o ajudante ResumoConta, vamos criar uma pasta App_Code na raiz do site. Clique com o botão direito sobre o site SegurancaMembors e selecione a opção New Folder e a seguir informe o nome App_Code;
No interior da pasta App_Code, adicione um arquivo chamado MembrosHelper.cshtml. Clique no item do menu New->New File e, a seguir, escolha o template CSHTML e informe o nome MembrosHelper.cshtml e clique em OK.
Depois substitua o código padrão gerado pelo seguinte código:
O código do helper é simples.
- Examinamos a propriedade WebSecurity.IsAuthenticated para obter o status de autenticação do usuário atual. Se o usuário estiver autenticado, exibimos o valor da propriedade WebSecurity.CurrentUserName, que contém o nome do usuário autenticado. Exibimos o nome de usuário como um link para a página changePassword;
- Ao lado do nome de usuário, nós exibimos um link para uma página que irá permitir que o usuário saia do site, este é um recurso de segurança importante para os usuários que podem estar em um computador público ou compartilhado;
- Se o usuário atual não está autenticado (usuário anônimo), exibimos links para as páginas de login e registro. Atualmente apenas a página de registro existe, vamos adicionar as páginas de login, logout, e a página ChangePassword posteriormente.
Finalmente, para exibir o helper ResumoConta na página inicial, precisamos adicionar uma chamada para MembrosHelpers.ResumoConta() na página Default.cshtml.
Vamos alterar o código da página Default.chtml conforme abaixo:
Executando o site iremos obter a seguinte página:
Na continuação deste artigo, irei criar as demais páginas e implementar as funcionalidades para login, logout e changePassword.
Pegue o projeto completo aqui: SegurancaMembros2.zip


















