Share via


Recuperação e alteração de senhas (VB)

por Scott Mitchell

Observação

Desde que este artigo foi escrito, os provedores de associação de ASP.NET foram substituídos por ASP.NET Identity. É altamente recomendável atualizar 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 várias vantagens sobre o sistema de associação ASP.NET, incluindo :

  • Melhor desempenho
  • Extensibilidade e testabilidade 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. Assim como os outros controles Da Web relacionados ao logon que vimos ao longo desta série de tutoriais, os controles PasswordRecovery e ChangePassword funcionam com a estrutura 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 email 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 considerar isso, os sites que oferecem contas de usuário precisam incluir uma maneira de um usuário recuperar sua senha. Esse processo normalmente envolve gerar uma senha nova e aleatória e enviar por email para o endereço de email do usuário no arquivo. Depois de receber a nova senha, a maioria dos usuários retorna ao site e altera a senha do gerado 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. Assim como os outros controles Da Web relacionados ao logon que vimos ao longo desta série de tutoriais, os controles PasswordRecovery e ChangePassword funcionam com a estrutura 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 dos MembershipUser métodos e ResetPassword da ChangePassword classe.

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

Todos os sites que dão 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 em ASP.NET é 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 para sua pergunta de segurança. Em seguida, ele envia a senha do usuário por email.

Observação

Como as mensagens de email são transmitidas pela transmissão em texto sem formatação, há riscos de segurança envolvidos no envio da senha de um usuário por email.

O controle PasswordRecovery consiste em três exibições:

  • UserName – solicita ao visitante seu nome de usuário. Essa é a exibição inicial.
  • Pergunta– exibe o nome de usuário e a pergunta de segurança do usuário como texto, juntamente com um TextBox para o usuário inserir a resposta para sua pergunta de segurança.
  • Êxito– exibe uma mensagem informando ao usuário que sua senha foi enviada por email.

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

  • RequiresQuestionAndAnswer
  • EnablePasswordRetrieval
  • EnablePasswordReset

A configuração da estrutura de RequiresQuestionAndAnswer associação indica se os usuários devem especificar uma pergunta e 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 de CreateUserWizard incluirá controles TextBox para a pergunta e resposta de segurança do novo usuário; se RequiresQuestionAndAnswer for False, essas informações não serão coletadas. Da mesma forma, se RequiresQuestionAndAnswer for True, o controle PasswordRecovery exibirá o modo de exibição Pergunta 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. No entanto, se RequiresQuestionAndAnswer for False, o controle PasswordRecovery passará diretamente da exibição UserName para a exibição Êxito.

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

Observação

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

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

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

Figura 1: o RequiresQuestionAndAnswer, EnablePasswordRetrievale EnablePasswordReset influenciam a aparência e o comportamento do controle PasswordRecovery (clique para exibir a imagem em tamanho real)

Observação

No tutorial Criando o esquema de associação no SQL Server configuramos o provedor de associação definindo RequiresQuestionAndAnswer como True, EnablePasswordRetrieval como False e EnablePasswordReset como True.

Usando o controle PasswordRecovery

Vamos examinar o uso do 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 como RecoverPwdID . Assim como os controles Da Web Login e CreateUserWizard, as exibições do controle PasswordRecovery renderizam uma interface composta avançada que inclui Rótulos, TextBoxes, Botões e controles de validação. Você pode personalizar a aparência dos modos de exibição por meio das propriedades de estilo do controle ou convertendo as exibições em modelos. Eu deixo isso como um exercício para o leitor interessado.

Quando um usuário visitar esta página, ela inserirá seu nome de usuário e clicará no botão Enviar. Como definimos a RequiresQuestionAndAnswer propriedade como True em nossas configurações 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 no arquivo. Tudo isso era possível sem que a gente precisasse escrever uma única linha de código!

Antes de testar esta página, há uma última parte da configuração que tende a ser: precisamos especificar as configurações de entrega de email em Web.config. O controle PasswordRecovery depende dessas configurações para enviar o email.

A configuração de entrega de email é especificada por meio do <system.net>elemento do <mailSettings> elemento . Use o <smtp> elemento para indicar o método de entrega e o endereço De padrão. A marcação a seguir define as configurações de email para usar um servidor SMTP de rede chamado 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ê pode, como alternativa, especificar um diretório de retirada em que as mensagens de email a serem enviadas devem ser depositadas.

Depois de definir as configurações do SMTP, visite a RecoverPassword.aspx página por meio de um navegador. Primeiro, tente inserir um nome de usuário que não existe no repositório de usuários. 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 UserNameFailureTextcontrole.

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

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

Agora insira um nome de usuário. Use o nome de usuário de uma conta no sistema com um endereço de email que você pode acessar e cuja resposta de segurança você conhece. Depois de inserir o nome de usuário e clicar em Enviar, o controle PasswordRecovery exibirá sua 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 será 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, a atribui à conta de usuário, envia um email informando ao usuário sobre sua nova senha (consulte a Figura 4) e exibe a exibição Êxito.

O usuário é enviado um Email com sua nova senha

Figura 4: O usuário é enviado um Email com sua nova senha (clique para exibir a imagem em tamanho real)

Personalizando o Email

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

Retorne ao site e faça logon usando as informações a seguir.

Nome de Usuário: nome de usuário

Senha: senha

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

O SendingMail evento é acionado logo antes da mensagem de email ser enviada e é nossa última chance de ajustar a mensagem de email programaticamente. 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 adiciona webmaster@example.com programaticamente à lista CC.

Protected Sub RecoverPwd_SendingMail(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.MailMessageEventArgs)Handles RecoverPwd.SendingMail
 e.Message.CC.Add("webmaster@example.com")
End Sub

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

Para personalizar o corpo da mensagem de email, precisamos criar um arquivo de modelo de email separado que contenha o conteúdo do corpo. Comece criando uma nova pasta no site chamado EmailTemplates. Em seguida, adicione um novo arquivo de texto a essa pasta chamado 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 e pela senha recuperada do usuário antes de enviar o email.

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

Depois de fazer essas alterações, reveja a RecoverPassword.aspx página e insira seu nome de usuário e resposta de segurança. Você receberá um email semelhante ao da Figura 5. Observe que webmaster@example.com foi CC'd e que o assunto e o corpo foram atualizados.

O assunto, o corpo e a lista CC foram atualizados

Figura 5: O assunto, o corpo e a lista CC foram atualizados (clique para exibir a imagem em tamanho real)

Para enviar um email formatado em HTML definido IsBodyHtml como True (o padrão é False) e atualizar o modelo de email 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 conseguir fazer logon com êxito no site. Portanto, atualize a Login.aspx página para incluir um link para a RecoverPassword.aspx página.

Redefinir programaticamente a senha de um usuário

Ao redefinir a senha de um usuário, o controle PasswordRecovery chama o MembershipUser método do ResetPasswordobjeto. 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 Associação, o ResetPassword método delega para o 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 de senha fornecida, entre outros campos. O procedimento armazenado garante que a resposta da senha corresponda e atualize 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 mais detalhadamente no tutorial Desbloquear e aprovar contas de usuário.
  • Se a resposta de senha estiver incorreta, a contagem de tentativas de resposta de senha com falha do usuário será incrementada. Se ocorrer um número especificado de tentativas de resposta de segurança inválidas em uma janela de tempo especificada, o usuário será bloqueado.

Um Word sobre como as senhas aleatórias são geradas

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

O GeneratePassword método usa um gerador de número aleatório criptograficamente forte para garantir que não haja nenhum desvio em quais caracteres aleatórios estão selecionados. Além disso, GeneratePassword é Public, o que significa que você pode usá-lo diretamente do aplicativo ASP.NET se precisar gerar cadeias de caracteres 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: Alterando senhas

As senhas geradas aleatoriamente são difíceis de lembrar. Considere a senha mostrada na Figura 4: WWGUZv(f2yM:Bd. Tente confirmar isso na memória! Desnecessário dizer que, depois que um usuário receber uma senha gerada aleatoriamente desse tipo, ela desejará 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 dois modos de exibição: Alterar Senha e Êxito. A exibiçã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 ChangePasswordobjeto. 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 ChangePwdcomo . Neste ponto, o modo de exibição Design deve mostrar a exibição Alterar Senha (consulte a Figura 6). Assim como acontece com o controle PasswordRecovery, você pode alternar entre as exibições por meio da Marca Inteligente do controle. Além disso, as aparências dessas exibiçõ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 Alterar Senha padrão renderiza apenas três controles TextBox: um para a senha antiga e dois para a nova senha. 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 será alterada.

Definir DisplayUserName como True será útil se você quiser permitir que um usuário conectado altere sua senha sem precisar fazer logon. Pessoalmente, acho que não há nada de errado em exigir que um usuário faça logon antes de permitir que ela altere sua senha. Portanto, deixe DisplayUserName definido como False (seu padrão). No entanto, ao tomar essa decisão, estamos essencialmente impedindo que usuários anônimos cheguem a esta página. Atualize as regras de autorização de URL do site para negar que usuários anônimos acessem ChangePassword.aspxo . Se você precisar atualizar a memória na sintaxe da regra de autorização de URL, consulte o tutorial Autorização baseada no usuário.

Observação

Pode parecer que a DisplayUserName propriedade é útil para permitir que os 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 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 Êxito é exibida.

Enviando uma Email 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 envie 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 , e Subject do MailDefinitionBodyFileNameIsBodyHtmlcontrole ChangePassword como ~/EmailTemplates/ChangePassword.htm, True e Sua senha foram alteradas!, respectivamente.

Depois de fazer essas alterações, reveja 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 no arquivo (consulte a Figura 8).

Uma mensagem 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 dão suporte a 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 a senha esquecida seria o administrador atribuir uma nova senha a ele. Com os controles PasswordRecovery e ChangePassword, no entanto, os usuários administrativos não precisam estar ocupados com a alteração das senhas dos usuários, pois os usuários são capazes de fazer isso por conta própria.

Mas e se 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 de trabalho. Para alterar a senha de um usuário, a senha antiga e nova deve ser fornecida ao MembershipUser método do ChangePassword objeto, mas um administrador não deve ter que 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 código como o seguinte:

Dim usr As MembershipUser = Membership.GetUser(username)
Dim resetPwd As String = 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 e 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 estiver definida de modo que RequiresQuestionAndAnswer seja False. Se RequiresQuestionAndAnswer for True, como é com nosso aplicativo, o ResetPassword método precisará ser passado a resposta de segurança, caso contrário, gerará uma exceção.

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

  • Jogue as mãos no ar 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 email de outro usuário. Talvez o usuário comprometido tenha deixado sua mesa para ir almoçar e não bloqueou sua estação de trabalho, ou talvez tenha acessado seus e-mails 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. Em seguida, o sistema enviará por email a senha recuperada sem solicitar a resposta de segurança.
  • Ignore a camada de abstração criada pela estrutura Associação e trabalhe diretamente com o banco de dados SQL Server. O esquema 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.

Eu fui em frente e implementei a terceira abordagem, escrevendo código que ignora as Membership classes e 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 é destruído. Essa decisão nos vincula ao SqlMembershipProvider, 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 desordenar este tutorial com um exame aprofundado dele. Se você estiver interessado em aprender 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 ocorrerá e o aspnet_Membership_SetPassword procedimento armazenado será 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 UserInformation.aspx momento, a página só funcionará se a estrutura Associação estiver configurada para armazenar senhas no formato Limpar ou Hashed. Ele não tem o código para criptografar a nova senha, embora você seja 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 para métodos no .NET Framework; comece examinando o SqlMembershipProvider método da ChangePassword classe. Essa é 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 avançada do usuário sem precisar escrever uma lambida de marcação declarativa ou 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. Como alternativa, as interfaces dos controles podem ser convertidas em modelos, para um grau de controle ainda mais fino. Nos bastidores, esses controles usam a API de Associação, invocando os MembershipUser métodos e ChangePassword do ResetPassword objeto.

Programação feliz!

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 do ASP/ASP.NET e fundador da 4GuysFromRolla.com, trabalha com tecnologias da Microsoft Web desde 1998. Scott trabalha como consultor independente, treinador e escritor. 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

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? Nesse caso, solte-me uma linha em mitchell@4GuysFromRolla.com