WebMatrix - Segurança e MemberShip - II


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.

Nossa página de registro de usuário 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 chamado Registro.cshtml na raiz 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:

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:

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;

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 esta 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

Salmos 9:9 O Senhor é também um alto refúgio para o oprimido, um alto refúgio em tempos de angústia.
Salmos 9:10
Em ti confiam os que conhecem o teu nome; porque tu, Senhor, não abandonas aqueles que te buscam.
Salmos 9:11
Cantai louvores ao Senhor, que habita em Sião; anunciai entre os povos os seus feitos.
Salmos 9:12
Pois ele, o vingador do sangue, se lembra deles; não se esquece do clamor dos aflitos.
Salmos 9:13
Tem misericórdia de mim, Senhor; olha a aflição que sofro daqueles que me odeiam, tu que me levantas das portas da morte.
Salmos 9:14
para que eu conte todos os teus louvores nas portas da filha de Sião e me alegre na tua salvação.
Salmos 9:15
Afundaram-se as nações na cova que abriram; na rede que ocultaram ficou preso o seu pé.
Salmos 9:16
O Senhor deu-se a conhecer, executou o juízo; enlaçado ficou o ímpio nos seus próprios feitos.

Salmos 9:17
Os ímpios irão para o Seol, sim, todas as nações que se esquecem de Deus.

Referências:


José Carlos Macoratti