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 EnablePasswordRetrieval
EnablePasswordReset
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.
Figura 1: o RequiresQuestionAndAnswer
, EnablePasswordRetrieval
e 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 RecoverPwd
ID
. 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 UserNameFailureText
controle.
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.
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.
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 SendingMail
controle 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
, BodyFileName
e 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 MailDefinition
propriedade 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.
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 ResetPassword
objeto. Esse método tem duas sobrecargas:
ResetPassword
– redefine a senha de um usuário. Use essa sobrecarga seRequiresQuestionAndAnswer
for False.ResetPassword(securityAnswer)
– redefine a senha de um usuário somente se o securityAnswer fornecido estiver correto. Use essa sobrecarga seRequiresQuestionAndAnswer
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 GeneratePassword
classe 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 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
como . 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.
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.aspx
o . 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).
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 MailDefinition
BodyFileName
IsBodyHtml
controle 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).
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 aRecoverPassword.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.
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:
- Inícios Rápidos do Controle ChangePassword
- Inícios Rápidos do Controle passwordRecovery
- Enviando Email em ASP.NET
System.Net.Mail
Faqs
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
Comentários
https://aka.ms/ContentUserFeedback.
Em breve: Ao longo de 2024, eliminaremos os problemas do GitHub como o mecanismo de comentários para conteúdo e o substituiremos por um novo sistema de comentários. Para obter mais informações, consulteEnviar e exibir comentários de