Récupération et changement des mots de passe (VB)
par Scott Mitchell
Remarque
Depuis l’écriture de cet article, les fournisseurs d’appartenance ASP.NET ont été remplacés par ASP.NET Identity. Nous vous recommandons vivement de mettre à jour les applications pour utiliser la plateforme ASP.NET Identity plutôt que les fournisseurs d’appartenance proposés au moment où cet article a été écrit. ASP.NET Identity présente un certain nombre d’avantages par rapport au système d’appartenance ASP.NET, notamment :
- Meilleures performances
- Extensibilité et testabilité améliorées
- Prise en charge d’OAuth, OpenID Connect et de l’authentification à deux facteurs
- Prise en charge des identités basées sur les revendications
- Meilleure interopérabilité avec ASP.Net Core
ASP.NET inclut deux contrôles Web pour faciliter la récupération et la modification des mots de passe. Le contrôle PasswordRecovery permet à un visiteur de récupérer son mot de passe perdu. Le contrôle ChangePassword permet à l’utilisateur de mettre à jour son mot de passe. Comme les autres contrôles Web liés à la connexion que nous avons vus dans cette série de tutoriels, les contrôles PasswordRecovery et ChangePassword fonctionnent avec l’infrastructure d’appartenance en arrière-plan pour réinitialiser ou modifier les mots de passe des utilisateurs.
Introduction
Entre les sites web de ma banque, société utilitaire, société téléphonique, compte de messagerie et portails web personnalisés, j’ai, comme la plupart des gens, des dizaines de mots de passe différents à mémoriser. Avec tant d’informations d’identification à mémoriser ces jours-ci, il n’est pas rare que les gens oublient leur mot de passe. Pour tenir compte de ce problème, les sites web qui proposent des comptes d’utilisateur doivent inclure un moyen pour un utilisateur de récupérer son mot de passe. Ce processus implique généralement de générer un nouveau mot de passe aléatoire et de l’envoyer par e-mail à l’adresse e-mail de l’utilisateur sur le fichier. Après avoir reçu leur nouveau mot de passe, la plupart des utilisateurs retournent sur le site et remplacent leur mot de passe par un mot de passe généré aléatoirement par un mot de passe plus mémorable.
ASP.NET inclut deux contrôles Web pour faciliter la récupération et la modification des mots de passe. Le contrôle PasswordRecovery permet à un visiteur de récupérer son mot de passe perdu. Le contrôle ChangePassword permet à l’utilisateur de mettre à jour son mot de passe. Comme les autres contrôles Web liés à la connexion que nous avons vus dans cette série de tutoriels, les contrôles PasswordRecovery et ChangePassword fonctionnent avec l’infrastructure d’appartenance en arrière-plan pour réinitialiser ou modifier les mots de passe des utilisateurs.
Dans ce tutoriel, nous allons examiner l’utilisation de ces deux contrôles. Nous verrons également comment modifier et réinitialiser par programmation le mot de passe d’un utilisateur via les méthodes et ResetPassword
les méthodes de ChangePassword
la MembershipUser
classe.
Étape 1 : Aider les utilisateurs à récupérer les mots de passe perdus
Tous les sites web qui prennent en charge les comptes d’utilisateur doivent fournir aux utilisateurs un mécanisme permettant de récupérer leurs mots de passe oubliés. La bonne nouvelle est que l’implémentation de ces fonctionnalités dans ASP.NET est une brise grâce au contrôle Web PasswordRecovery. Le contrôle PasswordRecovery affiche une interface qui invite l’utilisateur à entrer son nom d’utilisateur et, si nécessaire, la réponse à sa question de sécurité. Il envoie ensuite un e-mail à l’utilisateur son mot de passe.
Remarque
Étant donné que les messages électroniques sont transmis via le réseau en texte brut, il existe des risques de sécurité liés à l’envoi du mot de passe d’un utilisateur par e-mail.
Le contrôle PasswordRecovery se compose de trois vues :
- UserName : invite le visiteur à entrer son nom d’utilisateur. Il s’agit de la vue initiale.
- Question : affiche le nom d’utilisateur et la question de sécurité de l’utilisateur sous forme de texte, ainsi qu’un TextBox pour que l’utilisateur entre la réponse à sa question de sécurité.
- Réussite : affiche un message informant l’utilisateur que son mot de passe a été envoyé par e-mail.
Les vues affichées et les actions effectuées par le contrôle PasswordRecovery dépendent des paramètres de configuration d’appartenance suivants :
RequiresQuestionAndAnswer
EnablePasswordRetrieval
EnablePasswordReset
Le paramètre de RequiresQuestionAndAnswer
l’infrastructure d’appartenance indique si les utilisateurs doivent spécifier une question de sécurité et une réponse lors de l’inscription d’un compte. Comme nous l’avons vu dans le didacticiel Création de comptes d’utilisateur, si RequiresQuestionAndAnswer
la valeur est True (valeur par défaut), l’interface de CreateUserWizard inclut des contrôles TextBox pour la question de sécurité et la réponse du nouvel utilisateur ; si RequiresQuestionAndAnswer
elle a la valeur False, aucune information de ce type n’est collectée. De même, si RequiresQuestionAndAnswer
la valeur est True, le contrôle PasswordRecovery affiche l’affichage Question une fois que l’utilisateur a entré son nom d’utilisateur ; le mot de passe est récupéré uniquement si l’utilisateur entre la réponse de sécurité correcte. Si RequiresQuestionAndAnswer
la valeur est False, toutefois, le contrôle PasswordRecovery passe directement de l’affichage UserName à l’affichage Réussite.
Une fois que l’utilisateur a fourni son nom d’utilisateur ou sa réponse de sécurité, s’il RequiresQuestionAndAnswer
a la valeur True , le mot de passe PasswordRecovery envoie un e-mail à l’utilisateur son mot de passe. Si l’option a la EnablePasswordRetrieval
valeur True, l’utilisateur est envoyé par e-mail à son mot de passe actuel. S’il est défini sur False et EnablePasswordReset
a la valeur True, le contrôle PasswordRecovery génère un nouveau mot de passe aléatoire pour l’utilisateur et envoie un e-mail à ce nouveau mot de passe. Si les deux EnablePasswordRetrieval
sont False, EnablePasswordReset
le contrôle PasswordRecovery lève une exception.
Remarque
Rappelez-vous que les SqlMembershipProvider
mots de passe des utilisateurs sont enregistrés dans l’un des trois formats suivants : Effacer, hachage (valeur par défaut) ou Encrypted. Le mécanisme de stockage utilisé dépend des paramètres de configuration de l’appartenance ; l’application de démonstration utilise le format de mot de passe haché. Lorsque vous utilisez le format de mot de passe haché, l’option EnablePasswordRetrieval
doit être définie sur False, car le système ne peut pas déterminer le mot de passe réel de l’utilisateur à partir de la version hachée stockée dans la base de données.
La figure 1 illustre l’influence de l’interface et du comportement de PasswordRecovery par la configuration d’appartenance.
Figure 1 : The RequiresQuestionAndAnswer
, EnablePasswordRetrieval
and EnablePasswordReset
Influence the PasswordRecovery control’s Appearance and Behavior (Click to view full-size image)
Remarque
Dans le didacticiel Création du schéma d’appartenance dans SQL Server , nous avons configuré le fournisseur d’appartenances en affectant la valeur RequiresQuestionAndAnswer
True, EnablePasswordRetrieval
false et EnablePasswordReset
True.
Utilisation du contrôle PasswordRecovery
Examinons l’utilisation du contrôle PasswordRecovery dans une page ASP.NET. Ouvrez RecoverPassword.aspx
et faites glisser et déposez un contrôle PasswordRecovery de la boîte à outils sur le Concepteur ; définissez-le ID
RecoverPwd
sur . Comme les contrôles Web Login et CreateUserWizard, les vues du contrôle PasswordRecovery affichent une interface composite riche qui inclut des étiquettes, des textboxes, des boutons et des contrôles de validation. Vous pouvez personnaliser l’apparence des vues via les propriétés de style du contrôle ou en convertissant les vues en modèles. Je laisse cela comme un exercice pour le lecteur intéressé.
Lorsqu’un utilisateur visite cette page, elle entre son nom d’utilisateur et clique sur le bouton Envoyer. Étant donné que nous avons défini la RequiresQuestionAndAnswer
propriété sur True dans nos paramètres de configuration d’appartenance, le contrôle PasswordRecovery affiche ensuite l’affichage Question. Une fois que l’utilisateur a entré sa bonne réponse de sécurité et clique sur Envoyer, le contrôle PasswordRecovery met à jour le mot de passe de l’utilisateur sur un mot de passe généré de manière aléatoire et envoie ce mot de passe à l’adresse e-mail du fichier. Tout cela était possible sans qu’il soit nécessaire d’écrire une seule ligne de code !
Avant de tester cette page, il existe une dernière partie de la configuration à utiliser : nous devons spécifier les paramètres de remise de courrier dans Web.config
. Le contrôle PasswordRecovery s’appuie sur ces paramètres pour l’envoi de l’e-mail.
La configuration de la remise de courrier est spécifiée par le biais de l’élément de l’élément <mailSettings>
<system.net>
. Utilisez l’élément pour indiquer la <smtp>
méthode de remise et l’adresse From par défaut. Le balisage suivant configure les paramètres de messagerie pour utiliser un serveur SMTP réseau nommé smtp.example.com
sur le port 25 et avec les informations d’identification de nom d’utilisateur/mot de passe du nom d’utilisateur et du mot de passe.
Remarque
<system.net>
est un élément enfant de l’élément racine <configuration>
et un frère de <system.web>
. Par conséquent, ne placez pas l’élément <system.net>
dans l’élément <system.web>
; au lieu de cela, placez-le au même niveau.
<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>
Outre l’utilisation d’un serveur SMTP sur le réseau, vous pouvez également spécifier un répertoire de collecte dans lequel les messages électroniques à envoyer doivent être déposés.
Une fois que vous avez configuré les paramètres SMTP, visitez la RecoverPassword.aspx
page via un navigateur. Commencez par entrer un nom d’utilisateur qui n’existe pas dans le magasin d’utilisateurs. Comme le montre la figure 2, le contrôle PasswordRecovery affiche un message indiquant que les informations utilisateur n’ont pas pu être consultées. Le texte du message peut être personnalisé via la propriété du UserNameFailureText
contrôle.
Figure 2 : Un message d’erreur s’affiche si un nom d’utilisateur non valide est entré (cliquez pour afficher l’image de taille complète)
Entrez maintenant un nom d’utilisateur. Utilisez le nom d’utilisateur d’un compte dans le système avec une adresse e-mail accessible et dont vous connaissez la réponse de sécurité. Après avoir entré le nom d’utilisateur et cliqué sur Envoyer, le contrôle PasswordRecovery affiche son affichage Question. Comme avec la vue UserName, si vous entrez une réponse incorrecte, le contrôle PasswordRecovery affiche un message d’erreur (voir la figure 3). Utilisez la QuestionFailureText
propriété pour personnaliser ce message d’erreur.
Figure 3 : Un message d’erreur s’affiche si l’utilisateur entre une réponse de sécurité non valide (cliquez pour afficher l’image de taille complète)
Enfin, entrez la réponse de sécurité correcte, puis cliquez sur Envoyer. En arrière-plan, le contrôle PasswordRecovery génère un mot de passe aléatoire, l’affecte au compte d’utilisateur, envoie un e-mail informant l’utilisateur de son nouveau mot de passe (voir la figure 4), puis affiche la vue Réussite.
Figure 4 : L’utilisateur reçoit un e-mail avec son nouveau mot de passe (cliquez pour afficher l’image de taille complète)
Personnalisation de l’e-mail
L’e-mail par défaut envoyé par le contrôle PasswordRecovery est plutôt terne (voir la figure 4). Le message est envoyé à partir du compte spécifié dans l’attribut de from
l’élément <smtp>
avec le mot de passe de l’objet et le corps du texte brut :
Revenez au site et connectez-vous à l’aide des informations suivantes.
Nom d’utilisateur : nom d’utilisateur
Mot de passe : mot de passe
Ce message peut être personnalisé par programmation via un gestionnaire d’événements pour l’événement du contrôle PasswordRecovery, ou de manière déclarative via la MailDefinition
propriété.SendingMail
Examinons ces deux options.
L’événement SendingMail
est déclenché juste avant l’envoi du message électronique et nous avons la dernière chance d’ajuster le message électronique par programmation. Lorsque cet événement est déclenché, le gestionnaire d’événements est passé un objet de type MailMessageEventArgs
, dont Message
la propriété contient une référence à l’e-mail sur le point d’être envoyé.
Créez un gestionnaire d’événements pour l’événement SendingMail
et ajoutez le code suivant, qui s’ajoute webmaster@example.com
par programmation à la liste 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
Le message électronique peut également être configuré par le biais de moyens déclaratifs. La propriété passwordRecovery MailDefinition
est un objet de type MailDefinition
. La MailDefinition
classe offre un hôte de propriétés liées à l’e-mail, notamment From
, , CC
Priority
, Subject
, IsBodyHtml
, BodyFileName
et d’autres. Pour les démarrages, définissez la Subject
propriété sur quelque chose de plus descriptif que celui utilisé par défaut (mot de passe), tel que votre mot de passe a été réinitialisé...
Pour personnaliser le corps du message électronique, nous devons créer un fichier de modèle de messagerie distinct qui contient le contenu du corps. Commencez par créer un dossier dans le site web nommé EmailTemplates
. Ensuite, ajoutez un nouveau fichier texte à ce dossier nommé PasswordRecovery.txt
et ajoutez le contenu suivant :
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!
Notez l’utilisation des espaces réservés <%UserName%>
et <%Password%>
. Le contrôle PasswordRecovery remplace automatiquement ces deux espaces réservés par le nom d’utilisateur de l’utilisateur et le mot de passe récupéré avant d’envoyer l’e-mail.
Enfin, pointez la MailDefinition
propriété sur le modèle d’e-mail BodyFileName
que nous venons de créer (~/EmailTemplates/PasswordRecovery.txt
).
Après avoir apporté ces modifications, réexécuez la RecoverPassword.aspx
page et entrez votre nom d’utilisateur et votre réponse de sécurité. Vous recevez un e-mail qui ressemble à celui de la figure 5. Notez qu’il webmaster@example.com
a été CC’d et que le sujet et le corps ont été mis à jour.
Figure 5 : L’objet, le corps et la liste CC ont été mis à jour (cliquez pour afficher l’image de taille complète)
Pour envoyer un e-mail au format HTML défini IsBodyHtml
sur True (la valeur par défaut est False) et mettez à jour le modèle d’e-mail pour inclure du code HTML.
La MailDefinition
propriété n’est pas unique à la classe PasswordRecovery. Comme nous le verrons à l’étape 2, le contrôle ChangePassword offre également une MailDefinition
propriété. En outre, le contrôle CreateUserWizard inclut une telle propriété que vous pouvez configurer pour envoyer automatiquement un e-mail de bienvenue aux nouveaux utilisateurs.
Remarque
Actuellement, il n’existe aucun lien dans la navigation de gauche pour atteindre la RecoverPassword.aspx
page. Un utilisateur ne serait intéressé que par la visite de cette page si elle n’a pas pu se connecter correctement au site. Par conséquent, mettez à jour la Login.aspx
page pour inclure un lien vers la RecoverPassword.aspx
page.
Réinitialisation par programmation du mot de passe d’un utilisateur
Lors de la réinitialisation du mot de passe d’un utilisateur, le contrôle PasswordRecovery appelle la MembershipUser
méthode de l’objetResetPassword
. Cette méthode comporte deux surcharges :
ResetPassword
- réinitialise le mot de passe d’un utilisateur. Utilisez cette surcharge siRequiresQuestionAndAnswer
la valeur est False.ResetPassword(securityAnswer)
- réinitialise le mot de passe d’un utilisateur uniquement si le securityAnswer fourni est correct. Utilisez cette surcharge siRequiresQuestionAndAnswer
la valeur est True.
Les deux surcharges retournent le nouveau mot de passe généré de manière aléatoire.
Comme avec les autres méthodes de l’infrastructure d’appartenance, la ResetPassword
méthode délègue au fournisseur configuré. L’appel SqlMembershipProvider
de la aspnet_Membership_ResetPassword
procédure stockée, en passant le nom d’utilisateur de l’utilisateur, le nouveau mot de passe et la réponse de mot de passe fournie, entre autres champs. La procédure stockée garantit que la réponse de mot de passe correspond, puis met à jour le mot de passe de l’utilisateur.
Quelques notes d’implémentation de bas niveau :
- Un utilisateur verrouillé ne peut pas réinitialiser son mot de passe. Toutefois, un utilisateur non approuvé peut. Nous aborderons les états verrouillés et approuvés plus en détail dans le didacticiel Déverrouillage et approbation des comptes d’utilisateur .
- Si la réponse de mot de passe est incorrecte, le nombre de tentatives de réponse de mot de passe ayant échoué de l’utilisateur est incrémenté. Si un nombre spécifié de tentatives de réponse de sécurité non valides se produisent dans une fenêtre de temps spécifiée, l’utilisateur est verrouillé.
Mot sur la façon dont les mots de passe aléatoires sont générés
Les mots de passe générés de manière aléatoire indiqués dans les messages électroniques des figures 4 et 5 sont créés par la méthode de GeneratePassword
la classe Membership. Cette méthode accepte deux paramters d’entrée entiers - length et numberOfNonAlphanumericCharacters - et retourne une chaîne d’au moins des caractères de longueur avec au moins numberOfNonAlphanumericCharacters nombre de caractères non alphanumériques. Lorsque cette méthode est appelée à partir des classes d’appartenance ou des contrôles Web liés à la connexion, les valeurs de ces deux paramètres sont déterminées par les propriétés et MinRequiredNonalphanumericCharacters
les propriétés de MinRequiredPasswordLength
la configuration d’appartenance, que nous définissons respectivement sur 7 et 1.
La GeneratePassword
méthode utilise un générateur de nombres aléatoires fort par chiffrement pour s’assurer qu’il n’existe aucun biais dans les caractères aléatoires sélectionnés. En outre, c’est-à-dire GeneratePassword
Public
que vous pouvez l’utiliser directement à partir de votre application ASP.NET si vous devez générer des chaînes ou des mots de passe aléatoires.
Remarque
La SqlMembershipProvider
classe génère toujours un mot de passe aléatoire d’au moins 14 caractères. Par conséquent, si MinRequiredPasswordLength
elle est inférieure à 14, sa valeur est ignorée.
Étape 2 : Modification des mots de passe
Les mots de passe générés de manière aléatoire sont difficiles à mémoriser. Considérez le mot de passe indiqué dans la figure 4 : WWGUZv(f2yM:Bd
. Essayez de valider cela à la mémoire ! Inutile de dire qu’une fois qu’un utilisateur a envoyé un mot de passe généré de façon aléatoire de ce type, elle souhaite remplacer le mot de passe par quelque chose de plus mémorable.
Utilisez le contrôle ChangePassword pour créer une interface pour qu’un utilisateur modifie son mot de passe. Tout comme le contrôle PasswordRecovery, le contrôle ChangePassword se compose de deux vues : Modifier le mot de passe et la réussite. La vue Modifier le mot de passe invite l’utilisateur à entrer ses mots de passe anciens et nouveaux. Lorsque vous fournissez l’ancien mot de passe correct et un nouveau mot de passe qui répond aux exigences minimales de longueur et de caractères non alphanumériques, le contrôle ChangePassword met à jour le mot de passe de l’utilisateur et affiche la vue Réussite.
Remarque
Le contrôle ChangePassword modifie le mot de passe de l’utilisateur en appelant la méthode de l’objet MembershipUser
ChangePassword
. La méthode ChangePassword accepte deux String
paramètres d’entrée ( oldPassword et newPassword) et met à jour le compte de l’utilisateur avec le newPassword, en supposant que l’ancienPassword fourni est correct.
Ouvrez la ChangePassword.aspx
page et ajoutez un contrôle ChangePassword à la page, en l’renommant ChangePwd
. À ce stade, l’affichage Création doit afficher l’affichage Modifier le mot de passe (voir la figure 6). Comme avec le contrôle PasswordRecovery, vous pouvez basculer entre les vues via la balise active du contrôle. En outre, les apparences de ces vues sont personnalisables par le biais des propriétés de style triées ou en les convertissant en modèle.
Figure 6 : Ajouter un contrôle ChangePassword à la page (cliquez pour afficher l’image de taille complète)
Le contrôle ChangePassword peut mettre à jour le mot de passe de l’utilisateur actuellement connecté ou le mot de passe d’un autre utilisateur spécifié. Comme le montre la figure 6, la vue Modifier le mot de passe par défaut affiche uniquement trois contrôles TextBox : un pour l’ancien mot de passe et deux pour le nouveau mot de passe. Cette interface par défaut est utilisée pour mettre à jour le mot de passe de l’utilisateur actuellement connecté.
Pour utiliser le contrôle ChangePassword pour mettre à jour le mot de passe d’un autre utilisateur, définissez la propriété du DisplayUserName
contrôle sur True. Cela ajoute une quatrième zone de texte à la page, en demandant le nom d’utilisateur de l’utilisateur dont le mot de passe doit être modifié.
La valeur DisplayUserName
True est utile si vous souhaitez permettre à un utilisateur déconnecté de modifier son mot de passe sans avoir à se connecter. Personnellement, je pense qu’il n’y a rien de mal à demander à un utilisateur de se connecter avant de lui permettre de modifier son mot de passe. Par conséquent, laissez DisplayUserName
la valeur False (sa valeur par défaut). Toutefois, dans la prise de cette décision, nous empêchant essentiellement les utilisateurs anonymes d’atteindre cette page. Mettez à jour les règles d’autorisation d’URL du site afin de refuser aux utilisateurs anonymes de visiter ChangePassword.aspx
. Si vous devez actualiser votre mémoire sur la syntaxe de la règle d’autorisation d’URL, reportez-vous au didacticiel sur l’autorisation basée sur l’utilisateur.
Remarque
Il peut sembler que la DisplayUserName
propriété est utile pour permettre aux administrateurs de modifier les mots de passe d’autres utilisateurs. Toutefois, même lorsqu’il DisplayUserName
est défini sur True, l’ancien mot de passe correct doit être connu et entré. Nous aborderons les techniques permettant aux administrateurs de modifier les mots de passe des utilisateurs à l’étape 3.
Visitez la ChangePassword.aspx
page via un navigateur et modifiez votre mot de passe. Notez qu’un message d’erreur s’affiche si vous entrez un nouveau mot de passe qui ne répond pas à la longueur du mot de passe et aux exigences de caractères non alphanumériques spécifiées dans la configuration de l’appartenance (voir la figure 7).
Figure 7 : Ajouter un contrôle ChangePassword à la page (cliquez pour afficher l’image de taille complète)
Lors de l’entrée de l’ancien mot de passe correct et d’un nouveau mot de passe valide, le mot de passe de l’utilisateur connecté est modifié et l’affichage Réussite s’affiche.
Envoi d’un e-mail de confirmation
Par défaut, le contrôle ChangePassword n’envoie pas de message électronique à l’utilisateur dont le mot de passe vient d’être mis à jour. Si vous souhaitez envoyer un e-mail, configurez simplement la propriété du MailDefinition
contrôle. Nous allons configurer le contrôle ChangePassword afin que l’utilisateur soit envoyé un e-mail au format HTML qui contient son nouveau mot de passe.
Commencez par créer un fichier dans le EmailTemplates
dossier nommé ChangePassword.htm
. Ajoutez le balisage suivant :
<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>
Ensuite, définissez les propriétés du MailDefinition
BodyFileName
IsBodyHtml
Subject
contrôle ChangePassword sur ~/EmailTemplates/ChangePassword.htm, True et Votre mot de passe a changé !, respectivement.
Après avoir apporté ces modifications, réexévez la page et modifiez à nouveau votre mot de passe. Cette fois, le contrôle ChangePassword envoie un e-mail au format HTML personnalisé à l’adresse e-mail de l’utilisateur sur le fichier (voir la figure 8).
Figure 8 : Un message électronique informe l’utilisateur que son mot de passe a changé (cliquez pour afficher l’image de taille complète)
Étape 3 : Autoriser les administrateurs à modifier les mots de passe des utilisateurs
Une fonctionnalité courante dans les applications qui prennent en charge les comptes d’utilisateur est la possibilité pour un utilisateur administratif de modifier les mots de passe d’autres utilisateurs. Parfois, cette fonctionnalité est requise, car le système n’a pas la possibilité pour les utilisateurs de modifier leurs propres mots de passe. Dans ce cas, la seule façon pour un utilisateur de récupérer son mot de passe oublié serait que l’administrateur lui attribue un nouveau mot de passe. Toutefois, avec les contrôles PasswordRecovery et ChangePassword, les utilisateurs administratifs n’ont pas besoin de s’occuper eux-mêmes de modifier les mots de passe des utilisateurs, car les utilisateurs sont capables de le faire eux-mêmes.
Mais que se passe-t-il si votre client insiste pour que les utilisateurs administratifs puissent modifier les mots de passe d’autres utilisateurs ? Malheureusement, l’ajout de cette fonctionnalité peut être un peu de travail. Pour modifier le mot de passe d’un utilisateur, l’ancien et le nouveau mot de passe doivent être fournis à la méthode de ChangePassword
l’objetMembershipUser
, mais un administrateur ne doit pas avoir à connaître le mot de passe d’un utilisateur pour le modifier.
Une solution de contournement consiste à réinitialiser d’abord le mot de passe de l’utilisateur, puis à le remplacer par le nouveau mot de passe à l’aide de code comme suit :
Dim usr As MembershipUser = Membership.GetUser(username)
Dim resetPwd As String = usr.ResetPassword()
usr.ChangePassword(resetPwd, newPassword)
Ce code commence par récupérer des informations sur le nom d’utilisateur, qui est l’utilisateur dont le mot de passe l’administrateur souhaite modifier. Ensuite, la ResetPassword
méthode est appelée, qui affecte et l’utilisateur un nouveau mot de passe aléatoire. Ce mot de passe généré de manière aléatoire est retourné par la méthode et stocké dans la variable resetPwd
. Maintenant que nous connaissons le mot de passe de l’utilisateur, nous pouvons le modifier via un appel à ChangePassword
.
Le problème est que ce code fonctionne uniquement si la configuration du système d’appartenance est définie telle que RequiresQuestionAndAnswer
False. Si RequiresQuestionAndAnswer
la valeur est True, comme c’est le cas avec notre application, la ResetPassword
méthode doit être passée à la réponse de sécurité ; sinon, elle lève une exception.
Si l’infrastructure d’appartenance est configurée pour exiger une question et une réponse de sécurité, et que votre client insiste pour que les administrateurs puissent modifier les mots de passe des utilisateurs, vous avez trois options :
- Jetez vos mains dans l’air et dites à votre client que ce n’est qu’une chose qui ne peut pas être faite.
- Défini sur
RequiresQuestionAndAnswer
False. Cela entraîne une application moins sécurisée. Imaginez qu’un utilisateur méchant a obtenu l’accès à la boîte de réception de messagerie d’un autre utilisateur. Peut-être que l’utilisateur compromis a quitté son bureau pour aller déjeuner et n’a pas verrouillé sa station de travail, ou peut-être qu’il a accédé à son e-mail à partir d’un terminal public et ne s’est pas déconnecté. Dans les deux cas, l’utilisateur méchant peut visiter laRecoverPassword.aspx
page et entrer le nom d’utilisateur de l’utilisateur. Le système adresse ensuite un e-mail au mot de passe récupéré sans demander la réponse de sécurité. - Contournez la couche d’abstraction créée par l’infrastructure d’appartenance et travaillez directement avec la base de données SQL Server. Le schéma d’appartenance inclut une procédure stockée nommée
aspnet_Membership_SetPassword
qui définit le mot de passe d’un utilisateur et ne nécessite pas la réponse de sécurité ou l’ancien mot de passe pour accomplir sa tâche.
Aucune de ces options n’est particulièrement attrayante, mais c’est la façon dont la vie d’un développeur va parfois.
J’ai mis en œuvre la troisième approche, en écrivant du code qui contourne les Membership
classes et MembershipUser
opère directement sur la SecurityTutorials
base de données.
Remarque
En travaillant directement avec la base de données, l’encapsulation fournie par l’infrastructure d’appartenance est brisée. Cette décision nous lie à la SqlMembershipProvider
, rendant notre code moins portable. De plus, ce code peut ne pas fonctionner comme prévu dans les futures versions de ASP.NET si le schéma d’appartenance change. Cette approche est une solution de contournement et, comme la plupart des solutions de contournement, n’est pas un exemple de bonnes pratiques.
Le code comporte des bits peu attrayants et est assez long. Par conséquent, je ne veux pas encombrer ce tutoriel avec un examen approfondi de celui-ci. Si vous souhaitez en savoir plus, téléchargez le code de ce didacticiel et visitez la ~/Administration/ManageUsers.aspx
page. Cette page, que nous avons créée dans le didacticiel précédent, répertorie chaque utilisateur. J’ai mis à jour GridView pour inclure un lien vers la UserInformation.aspx
page, en passant le nom d’utilisateur de l’utilisateur sélectionné via la chaîne de requête. La UserInformation.aspx
page affiche des informations sur l’utilisateur sélectionné et les Zones de texte pour modifier son mot de passe (voir la figure 9).
Après avoir entré le nouveau mot de passe, confirmez-le dans la deuxième zone de texte, puis cliquez sur le bouton Mettre à jour l’utilisateur, une publication se produit et la aspnet_Membership_SetPassword
procédure stockée est appelée, mettant à jour le mot de passe de l’utilisateur. J’encourage les lecteurs intéressés par cette fonctionnalité à se familiariser avec le code et à essayer d’étendre la fonctionnalité pour inclure l’envoi d’un e-mail à l’utilisateur dont le mot de passe a été modifié.
Figure 9 : Un administrateur peut modifier le mot de passe d’un utilisateur (cliquez pour afficher l’image de taille complète)
Remarque
La UserInformation.aspx
page fonctionne actuellement uniquement si l’infrastructure d’appartenance est configurée pour stocker les mots de passe au format Clear ou Hashed. Il manque le code pour chiffrer le nouveau mot de passe, même si vous êtes invité à ajouter cette fonctionnalité. La façon dont je recommande d’ajouter le code nécessaire consiste à utiliser un décompileur comme Reflector pour examiner le code source des méthodes dans le .NET Framework ; commencez par examiner la méthode de ChangePassword
la SqlMembershipProvider
classe. Il s’agit de la technique que j’ai utilisée pour écrire le code pour créer un hachage du mot de passe.
Résumé
ASP.NET offre deux contrôles pour aider les utilisateurs à gérer leur mot de passe. Le contrôle PasswordRecovery est utile pour ceux qui ont oublié leurs mots de passe. Selon la configuration de l’infrastructure d’appartenance, l’utilisateur est envoyé par e-mail à son mot de passe existant ou un nouveau mot de passe généré de manière aléatoire. Le contrôle ChangePassword permet à un utilisateur de mettre à jour son mot de passe.
Comme les contrôles Login et CreateUserWizard, les contrôles PasswordRecovery et ChangePassword restituent une interface utilisateur riche sans avoir à écrire un léchage de balisage déclaratif ou de ligne de code. Si l’interface utilisateur par défaut ne répond pas à vos besoins, vous pouvez la personnaliser via diverses propriétés de style. Les interfaces des contrôles peuvent également être converties en modèles, pour un degré de contrôle encore plus fin. En arrière-plan, ces contrôles utilisent l’API Appartenance, appelant les méthodes et ChangePassword
les méthodes de ResetPassword
l’objetMembershipUser
.
Bonne programmation !
Pour aller plus loin
Pour plus d’informations sur les sujets abordés dans ce tutoriel, consultez les ressources suivantes :
- Démarrages rapides du contrôle ChangePassword
- Démarrages rapides du contrôle PasswordRecovery
- Envoi d’e-mails dans ASP.NET
System.Net.Mail
Questions fréquentes (FAQ)
À propos de l’auteur
Scott Mitchell, auteur de plusieurs livres ASP/ASP.NET et fondateur de 4GuysFromRolla.com, travaille avec les technologies Web Microsoft depuis 1998. Scott travaille en tant que consultant indépendant, formateur et écrivain. Son dernier livre est Sams Teach Yourself ASP.NET 2.0 en 24 heures. Scott peut être accessible à l’adresse mitchell@4guysfromrolla.com ou via son blog à .http://ScottOnWriting.NET
Merci spécial à
Cette série de tutoriels a été examinée par de nombreux réviseurs utiles. Les réviseurs principaux de ce tutoriel incluent Michael Emmings et Suchi Banerjee. Vous souhaitez consulter mes prochains articles MSDN ? Si c’est le cas, déposez-moi une ligne à mitchell@4GuysFromRolla.com