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

je cherche à mettre en œuvre une fonction Mot de passe oublié sur mon site web. J'aime l'option où un e-mail contenant un temporaire d'utilisation de l'URL qui expire au bout de quelque temps, est envoyé à l'utilisateur.

j'ai regardé les pages suivantes pour obtenir ces idées, mais je ne suis pas sûr de la façon de mettre en œuvre ce en utilisant ASP.NET et C#. Comme l'a indiqué l'un des utilisateurs, si je peux mettre en œuvre cette solution sans stocker ces informations dans la base de données, ce sera idéal. Veuillez informer.

réinitialisation du mot de passe par l'envoi de mots de passe temporaires

Merci.

27
demandé sur Community 2009-12-31 18:23:35

9 réponses

selon vos besoins, vous pourriez chiffrer l'information, dans un format similaire au suivant

(UserId)-(ExpireDate)

chiffrez les données, faites que le lien, puis décryptez les données et de prendre des mesures à partir de là...

brut, mais très probablement utilisable ,et ne nécessitant pas D'utilisation DB

-3
répondu Mitchel Sellers 2017-10-03 07:57:35

probablement la façon la plus facile sera de modifier votre table users pour ajouter 2 colonnes supplémentaires, ou si vous ne voulez pas modifier la table existante, vous pouvez ajouter une nouvelle table dépendante appelée" UserPasswordReset " ou quelque chose comme ça. Les colonnes sont comme ceci:

PasswordResetToken UNIQUEIDENTIFIER,
PasswordResetExpiration DATETIME

si vous allez avec la route de table supplémentaire, vous pouvez faire aussi ajouter la colonne UserID, en faire une clé primaire et une référence de clé foriegn retour à votre table d'utilisateurs. Une UNIQUE contrainte également être recommandé. Ensuite, vous utilisez simplement un Guid dans votre asp.net demande de jeton.

Le flux pourrait être quelque chose comme ceci:

  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 d'utilisateur) en réglant la transpiration de mot de passe à une date future (DateTime.Maintenant.AddDays(1)), et de définir le jeton de Guid.NewGuid ()
  3. e-Mail l'utilisateur un lien vers votre ResetPassword.aspx page avec le guid dans la chaîne de requête ( http://www.yoursite.com/ResetPassword.aspx?token=Guid-here )
  4. utilisez le mot-clé ResetPassword.page aspx pour valider les champs token et expiration. (I. E. assurez-vous que le type DateTime.Maintenant < PasswordResetExpiration)
  5. Fournir un formulaire simple qui permet à l'utilisateur de réinitialiser ce mot de passe.

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

61
répondu Scott Anderson 2009-12-31 15:35:55

@Alex

vous pouvez également utiliser le système.Sécurité.Cours de cryptographie dans .NET pour les algorithmes de hachage. Par exemple:

using System.Security.Cryptography;
...
var hash = SHA256CryptoServiceProvider.Create().ComputeHash(myTokenToHash);
...
2
répondu Rick Putnam 2010-10-11 18:34:49

ici, le système.Classe de Guid dans votre ami, car il va générer un unique (bien, assez unique) numéro de 128 bits:

  • Générer un nouveau Guid ( Système d'.GUID.NewGuid ())
  • stocker ce Guid quelque part (objet Application peut-être?)
  • envoyer une URL personnalisée dans un e-mail avec ce Guid
  • lorsque l'utilisateur accède au site, faites-les entrer le mot de passe que vous avez envoyé dans l'e-mail
  • si les mots de passe correspondent, allez - y et forcez-les à entrer un nouveau mot de passe
1
répondu Goyuix 2009-12-31 15:31:28

j'ai utilisé une classe de hachage pour créer des logins automatiques uniques constitués de la date/heure actuelle et l'adresse e-mail de l'utilisateur:

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

obtenir la Classe Hash à partir de: http://www.developerfusion.com/code/4601/create-hashes-md5-sha1-sha256-sha384-sha512/

puis il suffit de le prendre à partir de L'URL en utilisant:

if (Request.QueryString["hash"] != null)
{
                //extract Hash from the URL
                string strHash = Request.QueryString["hash"];
}
1
répondu Alex 2010-01-24 17:09:35

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

par exemple, si vous changez votre PG parce que vous pensez que votre compte a été compromis, vous ne voulez certainement pas qu'il reste accessible pendant que vous procédez au processus de changement.

aussi, l'inclusion d'informations "réelles" dans le token reset pourrait être décodé si quelqu'un vraiment il le veut et a la puissance. Il serait plus sûr de générer une chaîne de caractères aléatoire, de la sauvegarder dans la base de données dans la rangée pour cet utilisateur, puis d'y revenir quand le lien est cliqué.

cela vous donne deux choses:

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

1
répondu user813006 2013-02-26 20:28:00

le but de l'envoi de certaines données|chaîne de caractères à l'email de l'utilisateur est la validation du propriétaire du compte. Merci de soins sur certains points:

  • éviter d'envoyer des informations importantes dans le lien réinitialiser ou activer.
  • c'est la meilleure façon de stocker des données de chaîne uniques en conjonction avec l'utilisateur compte et de l'envoyer en tant que lien. mais attention, si vous envoyez simplement un section comme lien vers le courriel de l'utilisateur et il suffit de le vérifier dans la page, votre l'application peut être dangereuse par la force brute ou dictionnaire attaquant. Il suffit de vérifier une liste de chaînes pour trouver des liens et changer de mot de passe. Je sais que ça a une petite chance, mais pas zéro.

résultat: Je pense que c'est mieux si vous

  1. combinez le courriel de l'utilisateur avec le lien string puis cryptez-les (pas de hachage parce que la valeur hachée ne peut pas être inversée) et envoyer à l'utilisateur courriel.
  2. clic D'Utilisateur et votre page obtenir la valeur cryptée.
  3. décrypter valeur.
  4. extraire l'email de l'utilisateur.
  5. trouver e-mail dans la base de données.
  6. comparer chaîne de lien reçu avec un autre attaché à l'utilisateur e-mail dans la base de données.

bonne chance.

0
répondu QMaster 2012-12-02 08:57:11

j'utiliserais un code de hachage pour valider les détails dans l'url de réinitialisation du mot de passe. Tout cela peut se faire sans rien écrire à la DB ou envoyer d'informations privilégiées à un attaquant.

pour expliquer brièvement le mot de passe normal sel et hachage; dire que le sel est 1111 et le mot de passe est password , vous concaténez les deux et hachez la chaîne 1111password , dire que cela vous donne un hachage de 9999 , vous stockez alors le sel original 1111 et hachez 9999 dans votre dossier utilisateur.

quand vous validez un mot de passe vous utilisez le sel stocké, concaténez la tentative de mot de passe, hachez-le et comparez avec le hachage stocké. Par exemple, asecret devient 1111asecret mais devient 8888 . Cela ne correspond pas au hachage original, donc la correspondance de mot de passe échoue.

bien sûr, le sel et le hash seraient normalement générés et calculés correctement avec les bibliothèques crypto établies (ne pas inventez votre propre!).

pour l'URL de réinitialisation du mot de passe, j'ai mis l'identifiant unique de l'utilisateur, c'est-à-dire l'adresse e-mail, la date à laquelle la demande est faite, et un nouveau hachage. Ce hash serait généré à partir de ces détails concaténés ensemble plus le sel et hash déjà stockées pour l'utilisateur.

par exemple:

Email: user@example.com
Request Date: 2014-07-17
Salt: 1111
Hash: 9999

générer un nouveau hachage de ceux concaténés, i.e. 'user@example.com2014-07-1711119999' , dire que cela donne un hachage de 7777 .

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

https:\www.example.com\ResetPassword?email=user@example.com&requestdate=2014-07-17&hash=7777

le serveur combinera le courriel et la date fournie avec son sel et son hachage et confirmera que le hachage généré est le même que celui fourni. Si c'est Ok alors il affichera le formulaire de réinitialisation avec les trois mêmes paramètres cachés derrière elle, sinon une erreur. Ceux-ci sont soumis de nouveau et revérifiés lorsque le nouveau mot de passe est entré pour empêcher cette forme d'usurpation d'identité.

L'adresse e-mail doit être fourni pour en faire la demande et il est envoyé dans un courriel à la même adresse. la date est à peine informations priveleged 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 provoque l'échec du hachage et de L'URL pour signaler une erreur.

0
répondu Stephen Turner 2014-07-17 11:23:31

Il y a un problème avec cette approche. Un hachage sûr rend le jeton très long. Soit vous intégrez le sel dans le hash lui-même (ce qui le rend environ 20 caractères plus long), 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 aussi bien stocker un jeton aléatoire qui n'est dérivé d'aucun existant

0
répondu Sandeep yadav 2018-08-10 09:31:11