Compartilhar via


Recuperação e alteração de senhas (C#)

por Scott Mitchell

Observação

Desde que este artigo foi escrito, os provedores de associação ASP.NET foram substituídos pelo ASP.NET Identity. É altamente recomendável atualizar os aplicativos para usar a plataforma ASP.NET Identity em vez dos provedores de associação apresentados no momento em que este artigo foi escrito. ASP.NET Identity tem uma série de vantagens sobre o sistema de associação ASP.NET, incluindo:

  • Melhor desempenho
  • Extensibilidade e capacidade de teste aprimoradas
  • Suporte para OAuth, OpenID Connect e autenticação de dois fatores
  • Suporte à identidade baseada em declarações
  • Melhor interoperabilidade com ASP.Net Core

ASP.NET inclui dois controles da Web para ajudar na recuperação e alteração de senhas. O controle PasswordRecovery permite que um visitante recupere sua senha perdida. O controle ChangePassword permite que o usuário atualize sua senha. Como os outros controles Web relacionados ao logon que vimos ao longo desta série de tutoriais, os controles PasswordRecovery e ChangePassword funcionam com a estrutura de associação nos bastidores para redefinir ou modificar as senhas dos usuários.

Introdução

Entre os sites do meu banco, empresa de serviços públicos, empresa de telefonia, contas de e-mail e portais da web personalizados, eu, como a maioria das pessoas, tenho dezenas de senhas diferentes para lembrar. Com tantas credenciais para memorizar hoje em dia, não é incomum que as pessoas esqueçam sua senha. Para levar isso em conta, os sites que oferecem contas de usuário precisam incluir uma maneira de um usuário recuperar sua senha. Esse processo geralmente envolve gerar uma nova senha aleatória e enviá-la por e-mail para o endereço de e-mail do usuário registrado. Depois de receber sua nova senha, a maioria dos usuários retorna ao site e altera sua senha da gerada aleatoriamente para uma mais memorável.

ASP.NET inclui dois controles da Web para ajudar na recuperação e alteração de senhas. O controle PasswordRecovery permite que um visitante recupere sua senha perdida. O controle ChangePassword permite que o usuário atualize sua senha. Como os outros controles Web relacionados ao logon que vimos ao longo desta série de tutoriais, os controles PasswordRecovery e ChangePassword funcionam com a estrutura de associação nos bastidores para redefinir ou modificar as senhas dos usuários.

Neste tutorial, examinaremos o uso desses dois controles. Também veremos como alterar e redefinir programaticamente a senha de um usuário por meio da MembershipUser classe e ResetPassword dos ChangePassword métodos.

Etapa 1: Ajudando os usuários a recuperar senhas perdidas

Todos os sites que oferecem suporte a contas de usuário precisam fornecer aos usuários algum mecanismo para recuperar suas senhas esquecidas. A boa notícia é que implementar essa funcionalidade no ASP.NET é muito fácil graças ao controle da Web PasswordRecovery. O controle PasswordRecovery renderiza uma interface que solicita ao usuário seu nome de usuário e, se necessário, a resposta à sua pergunta de segurança. Em seguida, ele envia a senha do usuário por e-mail.

Observação

Como as mensagens de e-mail são transmitidas por fio em texto simples, há riscos de segurança envolvidos no envio da senha de um usuário por e-mail.

O controle PasswordRecovery consiste em três modos de exibição:

  • UserName - solicita ao visitante seu nome de usuário. Esta é a visão inicial.
  • Pergunta- exibe o nome de usuário do usuário e a pergunta de segurança como texto, juntamente com um TextBox para o usuário inserir a resposta à sua pergunta de segurança.
  • Sucesso- exibe uma mensagem informando ao usuário que sua senha foi enviada por e-mail.

As exibições exibidas e as ações executadas pelo controle PasswordRecovery dependem das seguintes definições de configuração de associação:

  • RequiresQuestionAndAnswer
  • EnablePasswordRetrieval
  • EnablePasswordReset

A configuração da RequiresQuestionAndAnswer estrutura de associação indica se os usuários devem especificar uma pergunta e uma resposta de segurança ao se registrar em uma conta. Como discutimos no tutorial Criando contas de usuário, se RequiresQuestionAndAnswer for True (o padrão), a interface do CreateUserWizard incluirá controles TextBox para a pergunta e a resposta de segurança do novo usuário; se RequiresQuestionAndAnswer for False, nenhuma dessas informações será coletada. Da mesma forma, se RequiresQuestionAndAnswer for True, o controle PasswordRecovery exibirá o modo de exibição Question depois que o usuário inserir seu nome de usuário; a senha será recuperada somente se o usuário inserir a resposta de segurança correta. Se RequiresQuestionAndAnswer for False, no entanto, o controle PasswordRecovery será movido diretamente do modo de exibição UserName para o modo de exibição Success.

Depois que o usuário fornecer seu nome de usuário - ou seu nome de usuário e resposta de segurança, se RequiresQuestionAndAnswer for True - o PasswordRecovery envia uma senha por e-mail ao usuário. Se a EnablePasswordRetrieval opção estiver definida como True, o usuário receberá sua senha atual por email. Se ele estiver definido como False e EnablePasswordReset estiver definido como True, o controle PasswordRecovery gerará uma nova senha aleatória para o usuário e enviará essa nova senha por email para ele. Se ambos e EnablePasswordRetrieval EnablePasswordReset forem False, o controle PasswordRecovery gerará uma exceção.

Observação

Lembre-se de que o SqlMembershipProvider armazena as senhas dos usuários em um dos três formatos: Clear, Hashed (o padrão) ou Encrypted. O mecanismo de armazenamento usado depende das definições de configuração de associação; o aplicativo de demonstração usa o formato de senha com hash. Ao usar o formato de senha com hash, a EnablePasswordRetrieval opção deve ser definida como False porque o sistema não pode determinar a senha real do usuário a partir da versão com hash armazenada no banco de dados.

A Figura 1 ilustra como a interface e o comportamento do PasswordRecovery são influenciados pela configuração de associação.

O RequiresQuestionAndAnswer, o EnablePasswordRetrieval e o EnablePasswordReset influenciam a aparência e o comportamento do controle PasswordRecovery

Figura 1: A aparência e o RequiresQuestionAndAnswerEnablePasswordRetrievalcomportamento do controle , e EnablePasswordReset Influence the PasswordRecovery (clique para exibir a imagem em tamanho completo)

Usando o controle PasswordRecovery

Vejamos como usar o controle PasswordRecovery em uma página ASP.NET. Abra RecoverPassword.aspx e arraste e solte um controle PasswordRecovery da Caixa de Ferramentas para o Designer; defina seu ID controle como RecoverPwd. Assim como os controles Web Login e CreateUserWizard, as exibições do controle PasswordRecovery renderizam uma interface composta avançada que inclui rótulos, caixas de texto, botões e controles de validação. Você pode personalizar a aparência das exibições por meio das propriedades de estilo do controle ou convertendo as exibições em modelos. Deixo isso como um exercício para o leitor interessado.

Quando um usuário visita esta página, ele digita seu nome de usuário e clica no botão Enviar. Como definimos a RequiresQuestionAndAnswer propriedade como True em nossas definições de configuração de associação, o controle PasswordRecovery exibirá o modo de exibição Pergunta. Depois que o usuário inserir sua resposta de segurança correta e clicar em Enviar, o controle PasswordRecovery atualizará a senha do usuário para uma gerada aleatoriamente e enviará essa senha por email para o endereço de email registrado. Tudo isso foi possível sem que tivéssemos que escrever uma única linha de código!

Antes de testar esta página, há uma última configuração a ser observada: precisamos especificar as configurações de entrega de e-mail no Web.config. O controle PasswordRecovery depende dessas configurações para enviar o email.

A configuração de entrega de email é especificada por meio <system.net> do elemento do<mailSettings> elemento. Use o <smtp> elemento para indicar o método de entrega e o endereço de remetente padrão. A marcação a seguir define as configurações de email para usar um servidor SMTP de rede nomeado smtp.example.com na porta 25 e com credenciais de nome de usuário/senha de nome de usuário e senha.

Observação

<system.net> é um elemento filho do elemento raiz <configuration> e um irmão de <system.web>. Portanto, não coloque o <system.net> elemento dentro do <system.web> elemento; em vez disso, coloque-o no mesmo nível.

<configuration>
 ...
 <system.net>
 <mailSettings>
 <smtp deliveryMethod="Network" from="youraddress@example.com">
 <network
 host="smtp.example.com"
 userName="username"
 password="password"
 port="25" />
 </smtp>
 </mailSettings>
 </system.net>
</configuration>

Além de usar um servidor SMTP na rede, você também pode especificar um diretório de recebimento no qual as mensagens de e-mail a serem enviadas devem ser depositadas.

Depois de definir as configurações de SMTP, visite a página por meio de RecoverPassword.aspx um navegador. Primeiro, tente inserir um nome de usuário que não exista na loja do usuário. Como mostra a Figura 2, o controle PasswordRecovery exibe uma mensagem indicando que as informações do usuário não puderam ser acessadas. O texto da mensagem pode ser personalizado por meio da propriedade do UserNameFailureText controle.

Uma mensagem de erro será exibida se um nome de usuário inválido for inserido

Figura 2: Uma mensagem de erro é exibida se um nome de usuário inválido for inserido (clique para exibir a imagem em tamanho real)

Agora digite um nome de usuário. Use o nome de usuário de uma conta no sistema com um endereço de e-mail que você possa acessar e cuja resposta de segurança você conheça. Depois de inserir o nome de usuário e clicar em Enviar, o controle PasswordRecovery exibe seu modo de exibição Pergunta. Assim como no modo de exibição UserName, se você inserir uma resposta incorreta, o controle PasswordRecovery exibirá uma mensagem de erro (consulte a Figura 3). Use a QuestionFailureText propriedade para personalizar essa mensagem de erro.

Uma mensagem de erro será exibida se o usuário inserir uma resposta de segurança inválida

Figura 3: Uma mensagem de erro é exibida se o usuário inserir uma resposta de segurança inválida (clique para exibir a imagem em tamanho real)

Por fim, insira a resposta de segurança correta e clique em Enviar. Nos bastidores, o controle PasswordRecovery gera uma senha aleatória, atribui-a à conta do usuário, envia um email informando o usuário sobre sua nova senha (consulte a Figura 4) e exibe o modo de exibição Success.

O usuário recebe um e-mail com sua nova senha

Figura 4: O usuário recebe um e-mail com sua nova senha (clique para exibir a imagem em tamanho real)

Personalizando o e-mail

O email padrão enviado pelo controle PasswordRecovery é bastante enfadonho (consulte a Figura 4). A mensagem é enviada da conta especificada no <smtp> atributo do from elemento com o assunto Password e o corpo do texto sem formatação:

Retorne ao site e faça login usando as seguintes informações.

Nome de usuário: nome de usuário

Senha: senha

Essa mensagem pode ser personalizada programaticamente por meio de um manipulador de SendingMail eventos para o evento do controle PasswordRecovery ou declarativamente por meio da MailDefinition propriedade. Vamos explorar essas duas opções.

O SendingMail evento é acionado logo antes do envio da mensagem de email e é nossa última chance de ajustar programaticamente a mensagem de email. Quando esse evento é gerado, o manipulador de eventos recebe um objeto do tipo MailMessageEventArgs, cuja Message propriedade contém uma referência ao email prestes a ser enviado.

Crie um manipulador de eventos para o SendingMail evento e adicione o código a seguir, que é adicionado webmaster@example.com programaticamente à lista de CC.

protected void RecoverPwd_SendingMail(object sender, MailMessageEventArgs e)
{
    e.Message.CC.Add("webmaster@example.com");
}

A mensagem de e-mail também pode ser configurada por meios declarativos. A propriedade do MailDefinition PasswordRecovery é um objeto do tipo MailDefinition. A MailDefinition classe oferece uma série de propriedades relacionadas a email, incluindo From, CC, Priority, Subject, IsBodyHtml, , BodyFileName, e outras. Para começar, defina a Subject propriedade para algo mais descritivo do que o usado por padrão ( Senha ), como Sua senha foi redefinida...

Para personalizar o corpo da mensagem de e-mail, precisamos criar um arquivo de modelo de e-mail separado que contenha o conteúdo do corpo. Comece criando uma nova pasta no site chamada EmailTemplates. Em seguida, adicione um novo arquivo de texto a esta pasta chamada PasswordRecovery.txt e adicione o seguinte conteúdo:

Your password has been reset, <%UserName%>!

According to our records, you have requested that your password be reset. Your new
password is: <%Password%>

If you have any questions or trouble logging on please contact a site administrator.

Thank you!

Observe o uso dos espaços reservados <%UserName%> e <%Password%>. O controle PasswordRecovery substitui automaticamente esses dois espaços reservados pelo nome de usuário do usuário e pela senha recuperada antes de enviar o email.

Por fim, aponte a MailDefinitionpropriedade do para o modelo de e-mail que acabamos de BodyFileName criar (~/EmailTemplates/PasswordRecovery.txt).

Depois de fazer essas alterações, revisite a RecoverPassword.aspx página e digite seu nome de usuário e resposta de segurança. Você deve receber um e-mail semelhante ao da Figura 5. Observe que webmaster@example.com foi copiado e que o assunto e o corpo foram atualizados.

A lista de assuntos, corpo e CC foram atualizados

Figura 5: A lista de assuntos, corpo e CC foram atualizados (clique para exibir a imagem em tamanho real)

Para enviar um e-mail formatado em HTML, defina IsBodyHtml como True (o padrão é False) e atualize o modelo de e-mail para incluir HTML.

A MailDefinition propriedade não é exclusiva da classe PasswordRecovery. Como veremos na Etapa 2, o controle ChangePassword também oferece uma MailDefinition propriedade. Além disso, o controle CreateUserWizard inclui essa propriedade que você pode configurar para enviar automaticamente uma mensagem de email de boas-vindas para novos usuários.

Observação

Atualmente, não há links na navegação à esquerda para acessar a RecoverPassword.aspx página. Um usuário só estaria interessado em visitar esta página se não conseguisse fazer logon no site com êxito. Portanto, atualize a Login.aspx página para incluir um link para a RecoverPassword.aspx página.

Redefinindo programaticamente a senha de um usuário

Ao redefinir a senha de um usuário, o controle PasswordRecovery chama o MembershipUser método do ResetPassword objeto. Esse método tem duas sobrecargas:

  • ResetPassword - Redefine a senha de um usuário. Use essa sobrecarga se RequiresQuestionAndAnswer for False.
  • ResetPassword(securityAnswer)- redefine a senha de um usuário somente se o securityAnswer fornecido estiver correto. Use essa sobrecarga se RequiresQuestionAndAnswer for True.

Ambas as sobrecargas retornam a nova senha gerada aleatoriamente.

Assim como acontece com os outros métodos na estrutura de associação, o método delega ResetPassword ao provedor configurado. O SqlMembershipProvider invoca o aspnet_Membership_ResetPassword procedimento armazenado, passando o nome de usuário do usuário, a nova senha e a resposta da senha fornecida, entre outros campos. O procedimento armazenado garante que a resposta da senha corresponda e, em seguida, atualiza a senha do usuário.

Algumas notas de implementação de baixo nível:

  • Um usuário bloqueado não pode redefinir sua senha. No entanto, um usuário não aprovado pode. Discutiremos os estados bloqueados e aprovados com mais detalhes no tutorial Desbloqueando e aprovando contas de usuário.
  • Se a resposta da senha estiver incorreta, a contagem de tentativas de resposta de senha com falha do usuário será incrementada. Se um número especificado de tentativas de resposta de segurança inválidas ocorrer dentro de uma janela de tempo especificada, o usuário será bloqueado.

Uma palavra sobre como as senhas aleatórias são geradas

As senhas geradas aleatoriamente mostradas nas mensagens de email nas Figuras 4 e 5 são criadas pelo método da GeneratePassword classe Membership. Esse método aceita dois parâmetros de entrada inteiros - length e numberOfNonAlphanumericCharacters - e retorna uma cadeia de caracteres com pelo menos caracteres de comprimento com pelo menos numberOfNonAlphanumericCharacters número de caracteres não alfanuméricos. Quando esse método é chamado de dentro das classes Membership ou controles Web relacionados ao logon, os valores desses dois parâmetros são determinados pela configuração e propriedades Membership MinRequiredPasswordLength MinRequiredNonalphanumericCharacters , que definimos como 7 e 1, respectivamente.

O GeneratePassword método usa um gerador de números aleatórios criptograficamente forte para garantir que não haja viés em quais caracteres aleatórios são selecionados. Além disso, GeneratePassword é public, o que significa que você pode usá-lo diretamente de seu aplicativo ASP.NET se precisar gerar strings ou senhas aleatórias.

Observação

A SqlMembershipProvider classe sempre gera uma senha aleatória com pelo menos 14 caracteres, portanto, se MinRequiredPasswordLength for menor que 14, seu valor será ignorado.

Etapa 2: alterar senhas

As senhas geradas aleatoriamente são difíceis de lembrar. Considere a senha mostrada na Figura 4: WWGUZv(f2yM:Bd. Tente memorizar isso! Escusado será dizer que, depois que um usuário recebe uma senha gerada aleatoriamente desse tipo, ele vai querer alterar a senha para algo mais memorável.

Use o controle ChangePassword para criar uma interface para um usuário alterar sua senha. Assim como o controle PasswordRecovery, o controle ChangePassword consiste em duas exibições: Alterar Senha e Êxito. A visualização Alterar senha solicita ao usuário suas senhas antigas e novas. Ao fornecer a senha antiga correta e uma nova senha que atenda aos requisitos mínimos de comprimento e caracteres não alfanuméricos, o controle ChangePassword atualiza a senha do usuário e exibe o modo de exibição Êxito.

Observação

O controle ChangePassword modifica a senha do usuário invocando o MembershipUser método do ChangePassword objeto. O método ChangePassword aceita dois string parâmetros de entrada - oldPassword e newPassword - e atualiza a conta do usuário com o newPassword, supondo que o oldPassword fornecido esteja correto.

Abra a ChangePassword.aspx página e adicione um controle ChangePassword à página, nomeando-a ChangePwd. Neste ponto, a visualização Design deve mostrar a visualização Alterar Senha (consulte a Figura 6). Assim como no controle PasswordRecovery, você pode alternar entre as exibições por meio da Marca Inteligente do controle. Além disso, as aparências dessas visualizações são personalizáveis por meio das propriedades de estilo variadas ou convertendo-as em um modelo.

Adicionar um controle ChangePassword à página

Figura 6: Adicionar um controle ChangePassword à página (clique para exibir a imagem em tamanho real)

O controle ChangePassword pode atualizar a senha do usuário conectado no momento ou a senha de outro usuário especificado. Como mostra a Figura 6, o modo de exibição padrão Change Password renderiza apenas três controles TextBox: um para a senha antiga e dois para a nova. Essa interface padrão é usada para atualizar a senha do usuário conectado no momento.

Para usar o controle ChangePassword para atualizar a senha de outro usuário, defina a propriedade do DisplayUserName controle como True. Isso adiciona um quarto TextBox à página, solicitando o nome de usuário do usuário cuja senha deve ser alterada.

A configuração DisplayUserName como True é útil se você quiser permitir que um usuário desconectado altere sua senha sem precisar fazer login. Pessoalmente, acho que não há nada de errado em exigir que um usuário faça login antes de permitir que ele altere sua senha. Portanto, deixe DisplayUserName definido como Falso (seu padrão). Ao tomar essa decisão, no entanto, estamos essencialmente impedindo que usuários anônimos acessem esta página. Atualize as regras de autorização de URL do site para impedir que usuários anônimos visitem ChangePassword.aspxo . Se você precisar atualizar sua memória na sintaxe da regra de autorização de URL, consulte o tutorial de autorização baseada no usuário.

Observação

Pode parecer que a propriedade é útil para permitir que os DisplayUserName administradores alterem as senhas de outros usuários. No entanto, mesmo quando DisplayUserName definido como True, a senha antiga correta deve ser conhecida e inserida. Falaremos sobre técnicas para permitir que os administradores alterem as senhas dos usuários na Etapa 3.

Visite a ChangePassword.aspx página por meio de um navegador e altere sua senha. Observe que uma mensagem de erro será exibida se você inserir uma nova senha que não atenda aos requisitos de comprimento de senha e caracteres não alfanuméricos especificados na configuração de associação (consulte a Figura 7).

Uma mensagem de erro será exibida se você inserir uma nova senha que não atenda aos requisitos de comprimento de senha e caracteres não alfanuméricos.

Figura 7: Adicionar um controle ChangePassword à página (clique para exibir a imagem em tamanho real)

Ao inserir a senha antiga correta e uma nova senha válida, a senha do usuário conectado é alterada e a exibição Sucesso é exibida.

Enviando um e-mail de confirmação

Por padrão, o controle ChangePassword não envia uma mensagem de email para o usuário cuja senha acabou de ser atualizada. Se você quiser enviar um email, basta configurar a propriedade do MailDefinition controle. Vamos configurar o controle ChangePassword para que o usuário receba um email formatado em HTML que contenha sua nova senha.

Comece criando um novo arquivo na EmailTemplates pasta chamada ChangePassword.htm. Adicione a seguinte marcação:

<html>
 <body>
 <h2>Your Password Has Been Changed!</h2>
 <p>
 This email confirms that your password has been changed.
 </p>
 <p>
 To log on to the site, use the following credentials:
 </p>
 <table>
 <tr>
 <td>
 <b>Username:</b>
 </td>
 <td>
 <%UserName%>
 </td>
 </tr>
 <tr>
 <td>
 <b>Password:</b>
 </td>
 <td>
 <%Password%>
 </td>
 </tr>
 </table>
 <p>
 If you have any questions or encounter any problems logging in,
 please contact a site administrator.
 </p>
 </body>
</html>

Em seguida, defina as propriedades BodyFileName, IsBodyHtml, e Subject e do controle MailDefinition ChangePassword como ~/EmailTemplates/ChangePassword.htm, True e Your password has changed!, respectivamente.

Depois de fazer essas alterações, visite novamente a página e altere sua senha novamente. Desta vez, o controle ChangePassword envia um email personalizado formatado em HTML para o endereço de email do usuário registrado (consulte a Figura 8).

Uma mensagem de email informa ao usuário que sua senha foi alterada

Figura 8: Uma mensagem de email informa ao usuário que sua senha foi alterada (clique para exibir a imagem em tamanho real)

Etapa 3: Permitir que os administradores alterem as senhas dos usuários

Um recurso comum em aplicativos que suportam contas de usuário é a capacidade de um usuário administrativo alterar as senhas de outros usuários. Às vezes, essa funcionalidade é necessária porque o sistema não tem a capacidade de os usuários alterarem suas próprias senhas. Nesse caso, a única maneira de um usuário recuperar sua senha esquecida seria o administrador atribuir uma nova senha. Com os controles PasswordRecovery e ChangePassword, no entanto, os usuários administrativos não precisam se ocupar com a alteração das senhas dos usuários, pois os usuários são capazes de fazer isso sozinhos.

Mas e se o seu cliente insistir que os usuários administrativos devem ser capazes de alterar as senhas de outros usuários? Infelizmente, adicionar essa funcionalidade pode ser um pouco trabalhoso. Para alterar a senha de um usuário, a senha antiga e a nova devem ser fornecidas ao MembershipUser método do ChangePassword objeto, mas um administrador não deve precisar saber a senha de um usuário para modificá-la.

Uma solução alternativa é primeiro redefinir a senha do usuário e, em seguida, alterá-la para a nova senha usando um código como o seguinte:

MembershipUser usr = Membership.GetUser(username);
string resetPwd = usr.ResetPassword();
usr.ChangePassword(resetPwd, newPassword);

Esse código começa recuperando informações sobre o nome de usuário, que é o usuário cuja senha o administrador deseja alterar. Em seguida, o ResetPassword método é invocado, que atribui ao usuário uma nova senha aleatória. Essa senha gerada aleatoriamente é retornada pelo método e armazenada na variável resetPwd. Agora que sabemos a senha do usuário, podemos alterá-la por meio de uma chamada para ChangePassword.

O problema é que esse código só funciona se a configuração do sistema de associação for definida de forma que RequiresQuestionAndAnswer seja False. Se RequiresQuestionAndAnswer for True, como acontece com nosso aplicativo, o ResetPassword método precisará receber a resposta de segurança, caso contrário, ele lançará uma exceção.

Se a estrutura de associação estiver configurada para exigir uma pergunta e resposta de segurança e, ainda assim, seu cliente insistir que os administradores possam alterar as senhas dos usuários, você terá três opções:

  • Jogue as mãos para o alto e diga ao seu cliente que isso é apenas uma coisa que não pode ser feita.
  • Defina RequiresQuestionAndAnswer como False. Isso resulta em um aplicativo menos seguro. Imagine que um usuário nefasto tenha obtido acesso à caixa de entrada de e-mail de outro usuário. Talvez o usuário comprometido tenha saído de sua mesa para almoçar e não tenha bloqueado sua estação de trabalho, ou talvez tenha acessado seu e-mail de um terminal público e não tenha saído. Em ambos os casos, o usuário nefasto pode visitar a RecoverPassword.aspx página e inserir o nome de usuário do usuário. O sistema enviará por e-mail a senha recuperada sem solicitar a resposta de segurança.
  • Ignore a camada de abstração criada pela estrutura de associação e trabalhe diretamente com o banco de dados do SQL Server. O esquema de associação inclui um procedimento armazenado chamado aspnet_Membership_SetPassword que define a senha de um usuário e não requer a resposta de segurança ou a senha antiga para realizar sua tarefa.

Nenhuma dessas opções é particularmente atraente, mas é assim que a vida de um desenvolvedor às vezes acontece.

Fui em frente e implementei a terceira abordagem, escrevendo código que ignora as Membership classes and MembershipUser e opera diretamente no SecurityTutorials banco de dados.

Observação

Ao trabalhar diretamente com o banco de dados, o encapsulamento fornecido pela estrutura de associação é quebrado. Essa decisão nos vincula SqlMembershipProviderao , tornando nosso código menos portátil. Além disso, esse código pode não funcionar conforme o esperado em versões futuras do ASP.NET se o esquema de associação for alterado. Essa abordagem é uma solução alternativa e, como a maioria das soluções alternativas, não é um exemplo de práticas recomendadas.

O código tem alguns bits pouco atraentes e é bastante longo. Portanto, não quero sobrecarregar este tutorial com um exame aprofundado dele. Se você estiver interessado em saber mais, baixe o código deste tutorial e visite a ~/Administration/ManageUsers.aspx página. Esta página, que criamos no tutorial anterior, lista cada usuário. Atualizei o GridView para incluir um link para a UserInformation.aspx página, passando o nome de usuário do usuário selecionado por meio da querystring. A UserInformation.aspx página exibe informações sobre o usuário selecionado e TextBoxes para alterar sua senha (consulte a Figura 9).

Depois de inserir a nova senha, confirmá-la no segundo TextBox e clicar no botão Atualizar usuário, um postback ocorre e o aspnet_Membership_SetPassword procedimento armazenado é invocado, atualizando a senha do usuário. Encorajo os leitores interessados nessa funcionalidade a se familiarizarem mais com o código e tentarem estender a funcionalidade para incluir o envio de um email para o usuário cuja senha foi alterada.

Um administrador pode alterar a senha de um usuário

Figura 9: Um administrador pode alterar a senha de um usuário (clique para exibir a imagem em tamanho real)

Observação

No momento, a UserInformation.aspx página só funciona se a estrutura de associação estiver configurada para armazenar senhas no formato Clear ou Hash. Ele não tem o código para criptografar a nova senha, embora você esteja convidado a adicionar essa funcionalidade. A maneira como recomendo adicionar o código necessário é usar um descompilador como o Reflector para examinar o código-fonte dos métodos no .NET Framework; comece examinando o SqlMembershipProvider método da ChangePassword classe. Esta é a técnica que usei para escrever o código para criar um hash da senha.

Resumo

ASP.NET oferece dois controles para ajudar os usuários a gerenciar sua senha. O controle PasswordRecovery é útil para aqueles que esqueceram suas senhas. Dependendo da configuração da estrutura de associação, o usuário recebe por email sua senha existente ou uma nova senha gerada aleatoriamente. O controle ChangePassword permite que um usuário atualize sua senha.

Assim como os controles Login e CreateUserWizard, os controles PasswordRecovery e ChangePassword renderizam uma interface de usuário avançada sem a necessidade de escrever uma marcação declarativa ou uma linha de código. Se a interface do usuário padrão não atender às suas necessidades, você poderá personalizá-la por meio de uma variedade de propriedades de estilo. Alternativamente, as interfaces dos controles podem ser convertidas em modelos, para um grau ainda mais fino de controle. Nos bastidores, esses controles usam a API de associação, invocando os objetos e ChangePassword os MembershipUser ResetPassword métodos.

Boa programação!

Leitura Adicional

Para obter mais informações sobre os tópicos discutidos neste tutorial, consulte os seguintes recursos:

Sobre o autor

Scott Mitchell, autor de vários livros ASP/ASP.NET e fundador da 4GuysFromRolla.com, trabalha com tecnologias da Web da Microsoft desde 1998. Scott trabalha como consultor, instrutor e escritor independente. Seu último livro é Sams Teach Yourself ASP.NET 2.0 em 24 horas. Scott pode ser contatado em mitchell@4guysfromrolla.com ou através de seu blog em http://ScottOnWriting.NET.

Agradecimentos especiais a

Esta série de tutoriais foi revisada por muitos revisores úteis. Os principais revisores deste tutorial incluem Michael Emmings e Suchi Banerjee. Interessado em revisar meus próximos artigos do MSDN? Se sim, me mande uma mensagem em mitchell@4GuysFromRolla.com