Tout d'abord, nous devons savoir ce que vous savez déjà sur l'utilisateur. De toute évidence, vous avez un nom d'utilisateur et un ancien mot de passe. Que savez-vous d'autre ? Avez-vous une adresse électronique ? Avez-vous des données concernant la fleur préférée de l'utilisateur ?
En supposant que vous disposez d'un nom d'utilisateur, d'un mot de passe et d'une adresse électronique de travail, vous devez ajouter deux champs à votre table utilisateur (en supposant qu'il s'agisse d'une table de base de données) : une date appelée new_passwd_expire et une chaîne de caractères new_passwd_id.
En supposant que vous disposez de l'adresse électronique de l'utilisateur, lorsque quelqu'un demande une réinitialisation de son mot de passe, vous mettez à jour la table des utilisateurs comme suit :
new_passwd_expire = now() + some number of days
new_passwd_id = some random string of characters (see below)
Ensuite, vous envoyez un courriel à l'utilisateur à cette adresse :
Cher monsieur et madame
Quelqu'un a demandé un nouveau mot de passe pour le compte d'utilisateur <nom d'utilisateur> à <votre nom de site web>. Si vous avez demandé cette réinitialisation de mot de passe, suivez ce lien :
http://example.com/yourscript.lang?update=<new_password_id >
Si ce lien ne fonctionne pas, vous pouvez vous rendre à l'adresse suivante http://example.com/yourscript.lang et saisissez le texte suivant dans le formulaire : <nouveau_mot_de_passe>
Si vous n'avez pas demandé de réinitialisation de votre mot de passe, vous pouvez ignorer cet e-mail.
Merci, yada yada
Maintenant, le codage de votre script.lang : Ce script a besoin d'un formulaire. Si la var update est passée sur l'URL, le formulaire demande juste le nom d'utilisateur et l'adresse email de l'utilisateur. Si update n'est pas passé, il demande le nom d'utilisateur, l'adresse email, et le code d'identification envoyé dans l'email. Vous demandez également un nouveau mot de passe (deux fois bien sûr).
Pour vérifier le nouveau mot de passe de l'utilisateur, vous vérifiez que le nom d'utilisateur, l'adresse électronique et le code d'identification correspondent tous, que la demande n'a pas expiré et que les deux nouveaux mots de passe correspondent. En cas de succès, vous changez le mot de passe de l'utilisateur par le nouveau mot de passe et effacez les champs de réinitialisation de mot de passe de la table des utilisateurs. Veillez également à déconnecter l'utilisateur/effacer tous les cookies liés à la connexion et à rediriger l'utilisateur vers la page de connexion.
Essentiellement, le champ new_passwd_id est un mot de passe qui ne fonctionne que sur la page de réinitialisation du mot de passe.
Une amélioration possible : vous pourriez supprimer <nom d'utilisateur> de l'email. "Quelqu'un a demandé une réinitialisation du mot de passe pour un compte à cette adresse email...." Faisant ainsi du nom d'utilisateur quelque chose que seul l'utilisateur connaît si l'email est intercepté. Je n'ai pas commencé de cette façon car si quelqu'un attaque le compte, il connaît déjà le nom d'utilisateur. Cette obscurité supplémentaire empêche les attaques de type "man-in-the-middle" au cas où une personne malveillante intercepterait l'e-mail.
Quant à vos questions :
générant la chaîne aléatoire : Il n'est pas nécessaire qu'elle soit extrêmement aléatoire. N'importe quel générateur de GUID ou même md5(concat(salt,current_timestamp())) est suffisant, où salt est quelque chose sur l'enregistrement de l'utilisateur comme la date de création du compte. Ce doit être quelque chose que l'utilisateur ne peut pas voir.
timer : Oui, vous en avez besoin pour garder votre base de données saine. Pas plus d'une semaine est vraiment nécessaire, mais au moins deux jours, car on ne sait jamais combien de temps peut durer le retard d'un courriel.
Adresse IP : Comme le courrier électronique peut être retardé de plusieurs jours, l'adresse IP n'est utile que pour l'enregistrement, pas pour la validation. Si vous voulez l'enregistrer, faites-le, sinon vous n'en avez pas besoin.
Écran de réinitialisation : Voir ci-dessus.
J'espère que c'est suffisant. Bonne chance.
0 votes
ASP.NET MVC utilise le fournisseur d'authentification ASP.NET par défaut, donc tous les échantillons de code que vous trouverez autour de ce fournisseur ne devraient pas être pertinents pour vos besoins.