web-dev-qa-db-fra.com

Générer une URL temporaire pour réinitialiser le mot de passe

Je souhaite mettre en œuvre une fonctionnalité de mot de passe oublié sur mon site Web. J'aime l'option où un courrier électronique contenant une URL temporaire à usage unique qui expire après un certain temps est envoyé à l'utilisateur. 

J'ai consulté les pages suivantes pour trouver ces idées, mais je ne sais pas comment l'implémenter à l'aide d'ASP.NET et de C #. Comme l’a indiqué l’un des utilisateurs, si je peux implémenter cela sans stocker ces informations dans la base de données, ce sera l’idéal. S'il vous plaît donnez votre avis.

Réinitialisation du mot de passe en envoyant un e-mail à des mots de passe temporaires

Merci.

27
Pratik Kothari

Le moyen le plus simple sera probablement de modifier votre table d'utilisateurs pour ajouter 2 colonnes supplémentaires, OR si vous ne souhaitez pas modifier la table existante, vous pouvez ajouter une nouvelle table dépendante appelée "UserPasswordReset" ou quelque chose du genre. . Les colonnes sont comme ça:

PasswordResetToken UNIQUEIDENTIFIER,
PasswordResetExpiration DATETIME

Si vous choisissez la route de table supplémentaire, vous pouvez également ajouter la colonne ID utilisateur, en faire une clé primaire et une référence de clé inactive dans votre table d'utilisateurs. Une contrainte UNIQUE serait également recommandée. Ensuite, vous utilisez simplement un Guid dans votre application asp.net en tant que jeton.

Le flux pourrait être quelque chose comme ça:

  1. L'utilisateur demande la réinitialisation du mot de passe pour son compte.
  2. Vous insérez un nouvel enregistrement dans la table (ou mettez à jour leur enregistrement utilisateur) en définissant PasswordResetExpiration sur une date ultérieure (DateTime.Now.AddDays (1)), puis en définissant le jeton sur Guid.NewGuid ().
  3. Envoyez à l'utilisateur un lien vers votre page ResetPassword.aspx avec le guid dans la chaîne de requête ( http://www.votresite.com/ResetPassword.aspx?token=Guid-here )
  4. Utilisez la page ResetPassword.aspx pour valider les champs de jeton et d’expiration. (I.E. Assurez-vous que DateTime.Now <PasswordResetExpiration)
  5. Fournissez un formulaire simple permettant à l'utilisateur de réinitialiser ce mot de passe.

Je sais que vous vouliez éviter de modifier la base de données, mais c'est probablement la méthode la plus simple.

64
Scott Anderson

@Alex

Vous pouvez également utiliser les classes System.Security.Cryptography dans .NET pour les algorithmes de hachage. Par exemple:

using System.Security.Cryptography;
...
var hash = SHA256CryptoServiceProvider.Create().ComputeHash(myTokenToHash);
...
2
Rick Putnam

Je voudrais certainement inclure la base de données dans ce processus. Une fois la réinitialisation demandée, c'est une bonne idée d'indiquer que le compte est verrouillé. 

Par exemple, si vous modifiez votre pw parce que vous pensez que votre compte a peut-être été compromis, vous ne voulez certainement pas qu'il reste accessible pendant le processus de modification.

En outre, l'inclusion d'informations "réelles" dans le jeton de réinitialisation peut être décodée si quelqu'un le veut vraiment et a la puissance. Il serait plus sûr de générer une chaîne aléatoire, de la sauvegarder dans la base de données de la ligne correspondant à cet utilisateur, puis de revenir à cette chaîne lorsque le lien est cliqué.

Cela vous donne deux choses:

1) Il n'y a rien à déchiffrer et aucune valeur ne peut en être tirée . 2) La présence du jeton dans l'enregistrement de l'utilisateur indique que la réinitialisation est en cours et que le compte doit être considéré comme verrouillé.

1
user813006

Ici, la classe System.Guid de votre ami, car elle générera un nombre unique (enfin, assez unique) 128 bits:

  • Générer un nouveau Guid (System.Guid.NewGuid ())
  • Stocker ce Guid quelque part (objet Application peut-être?)
  • Envoyer une URL personnalisée dans un email avec ce Guid
  • Lorsque l'utilisateur accède au site, faites-lui entrer le mot de passe que vous avez envoyé dans l'email.
  • Si les mots de passe correspondent, continuez et forcez-les à entrer un nouveau mot de passe
1
Goyuix

J'ai utilisé une classe de hachage pour créer des connexions automatiques uniques composées de la date/heure actuelle et de l'adresse de messagerie de l'utilisateur:

string strNow = DateTime.Now.ToString();
string strHash = strNow + strEmail;
strHash = Hash.GetHash(strHash, Hash.HashType.SHA1);

obtenir la classe de hachage à l'adresse: http://www.developerfusion.com/code/4601/create-hashes-md5-sha1-sha256-sha384-sha512/

Ensuite, prenez-le à partir de l'URL en utilisant:

if (Request.QueryString["hash"] != null)
{
                //extract Hash from the URL
                string strHash = Request.QueryString["hash"];
}
1
Alex

Le but de l'envoi d'une chaîne de données au courrier électronique de l'utilisateur est la validation du propriétaire du compte. S'il vous plaît se soucier de certains points:

  • Évitez d’envoyer des informations importantes dans le lien de réinitialisation ou d’activation.
  • C'est le meilleur moyen de stocker une conjonction de données de chaîne unique avec le compte utilisateur Et de l'envoyer sous ce lien. mais sachez que si vous envoyez une seule section en tant que lien vers la messagerie de l'utilisateur et que vous la vérifiez dans la page, votre application peut être dangereuse par force brutale ou par dictionnaire attaquant. Il suffit de vérifier une liste de chaînes pour trouver des liens .__ et changer le mot de passe. Je sais que cela a une petite chance, mais pas zéro.

Résultat: Je pense que c'est mieux si tu 

  1. combinez le courrier électronique de l'utilisateur avec le lien de la chaîne, puis chiffrez-les .__ (pas de hachage car la valeur hachée ne peut pas être inversée) et envoyez-le à l'utilisateuremail.
  2. Cliquez sur l'utilisateur et votre page obtiendra la valeur cryptée.
  3. déchiffrer la valeur.
  4. extraire le courrier électronique de l'utilisateur.
  5. trouver un email dans la base de données.
  6. compare la chaîne du lien reçu avec un autre attaché à useremail dans la base de données.

Bonne chance.

0
QMaster

J'utiliserais un code de hachage pour valider les détails dans l'URL de réinitialisation du mot de passe. Tout cela peut être fait sans rien écrire dans la base de données ni envoyer d’informations privilégiées à un mandataire.

Pour expliquer brièvement le mot de passe normal, sel et hachage; dites que le sel est 1111 et que le mot de passe est password, vous devez concaténer les deux et hacher la chaîne 1111password, dire que cela vous donne un hachage de 9999, puis stocker le sel original 1111 et le hachage 9999 dans votre enregistrement utilisateur. 

Lorsque vous validez un mot de passe, vous utilisez le sel stocké, concaténez la tentative de mot de passe, le hachez et comparez-le avec le hachage stocké. Par exemple, asecret devient 1111asecret mais se divise en 8888. Cela ne correspond pas au hachage d'origine, donc la correspondance du mot de passe échoue.

Bien sûr, le sel et le hash seraient normalement générés et calculés correctement avec des bibliothèques de chiffrement établies (n'inventez pas les vôtres!).

Pour l'URL de réinitialisation du mot de passe, je mettrais l'identifiant unique de l'utilisateur, à savoir l'adresse e-mail, la date à laquelle la demande est faite et un nouveau hachage. Ce hachage serait généré à partir des détails concaténés, plus le sel et le hachage déjà stockés pour l'utilisateur.

Par exemple:

Email: [email protected]
Request Date: 2014-07-17
Salt: 1111
Hash: 9999

Générez un nouveau hachage de ceux concaténés, c'est-à-dire '[email protected]', disons que cela donne un hachage de 7777.

L'URL que je générerais alors aurait l'email, la date de la demande et le nouveau hachage:

https:\\www.example.com\[email protected]&requestdate=2014-07-17&hash=7777

Le serveur combinera le courrier électronique et la date fournie avec son sel et son hachage et confirmera que le hachage généré est identique à celui fourni. S'il s'agit de Ok, il affichera le formulaire de réinitialisation avec les trois mêmes paramètres cachés, sinon une erreur. Ceux-ci sont soumis à nouveau et revérifiés lorsque le nouveau mot de passe est entré pour éviter que ce formulaire ne soit usurpé. 

L'adresse e-mail doit être fournie pour effectuer la demande et elle est uniquement envoyée dans un e-mail à la même adresse. la date est à peine informée et le hachage n'est pas réversible, donc ne donne rien de toute façon. Rien n'a été écrit dans la base de données et toute modification des paramètres entraîne l'échec du hachage et le signalement d'une erreur par l'URL.

0
Stephen Turner

Il y a un problème avec cette approche. Un hachage sécurisé rend le jeton très long. Soit vous intégrez le sel dans le hachage lui-même (ce qui le rend plus long d'environ 20 caractères), soit vous stockez ce sel unique dans la base de données. Si vous stockez le sel dans la base de données, vous pouvez également stocker un jeton aléatoire qui n’est pas dérivé d’une liste existante. 

0
Sandeep yadav