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.
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:
Je sais que vous vouliez éviter de modifier la base de données, mais c'est probablement la méthode la plus simple.
@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);
...
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é.
Ici, la classe System.Guid de votre ami, car elle générera un nombre unique (enfin, assez unique) 128 bits:
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"];
}
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:
Résultat: Je pense que c'est mieux si tu
Bonne chance.
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.
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.