Comment mettre en Œuvre des Réinitialisations de Mot de passe?
Je travaille sur une application en ASP.NET et je me demandais comment je pourrais mettre en œuvre un Password Reset
fonction de si je voulais rouler mes propres.
Précisément, j'ai les questions suivantes:
- Ce qui est un bon moyen de générer un IDENTIFIANT Unique qui est difficile à résoudre?
- Devrait-il y avoir une minuterie attaché à elle? Si oui, combien de temps devrait-il être?
- Dois-je enregistrer l'adresse IP? Est-il encore de l'importance?
- Quelles informations dois-je demander en vertu de la Réinitialisation du Mot de passe de l'écran ? Juste une adresse de Courriel? Ou peut-être l'adresse email de plus un élément d'information qu'ils "savent"? (Équipe Favorite, le chiot de nom, etc)
Y a d'autres considérations, j'ai besoin d'être au courant?
NB: D'autres questions ont l'estomper techniques de mise en œuvre entièrement. En effet accepté de répondre à des gloses sur les détails sanglants. J'espère que cette question et les réponses données ultérieurement vont aller dans les détails sanglants, et, je l'espère, par le phrasé cette question de plus en plus étroitement que les réponses sont moins "fluff" et plus "gore'.
Modifier: les Réponses qui vont également dans la façon dont un tel tableau serait modélisé et gérées dans SQL Server ou tout ASP.NET MVC liens vers une réponse serait appréciée.
- ASP.NET MVC utilise la valeur par défaut ASP.NET fournisseur d'authentification, de sorte que toute les exemples de code que vous trouverez autour de qui sshould jusqu'à être pertinents pour vos besoins.
Vous devez vous connecter pour publier un commentaire.
Beaucoup de bonnes réponses ici, je ne vais pas la peine de répéter tout...
Sauf pour une question, qui est repris par la quasi-totalité de réponse ici, même si c'est mal:
Ce n'est pas vrai, les Guid sont très faibles identifiants, et devrait PAS être utilisé pour permettre l'accès à un compte utilisateur.
Si vous examinez la structure, vous obtenez un total de 128 bits au plus... ce qui n'est pas considéré comme un beaucoup de nos jours.
Dont la première moitié est typique de l'invariant (pour le système de production), et la moitié de ce qui est à gauche est dépendant du temps (ou quelque chose de similaire).
Dans l'ensemble, son très faible et facilement bruteforced mécanisme.
Afin de ne pas les utiliser!
Au lieu de cela, il suffit d'utiliser un cryptage fort générateur de nombre aléatoire (
System.Security.Cryptography.RNGCryptoServiceProvider
), et obtenir au moins 256 bits raw entropie.Tout le reste, comme de nombreux autres réponses fournies.
Guid.NewGUID()
utilise v4...vomited
m'a fait me sentir mal. Il a posté cette réponse au point une faille potentielle de la sécurité de l'utilisation de GUID, et a mentionné que toutes les autres réponses ont un bon débit, mais juste pour changer le générateur de nombre aléatoire pour quelque chose de conçu pour plus de sécurité. Je ne vois rien de répréhensible ici.MODIFIER 2012/05/22: Comme suite à cette réponse, je ne l'utilise plus Guid moi-même dans cette procédure. Comme les autres populaire réponse, j'utilise mon propre algorithme de hachage pour générer la clé à envoyer dans l'URL. Cela a l'avantage d'être plus court ainsi. Regardez dans le Système.De sécurité.La cryptographie pour les générer, qui j'ai l'habitude d'utiliser un SEL.
Tout d'abord, ne pas immédiatement réinitialiser le mot de passe utilisateur.
Tout d'abord, ne pas immédiatement réinitialiser le mot de passe utilisateur quand ils en font la demande. C'est une violation de la sécurité comme quelqu'un pouvait deviner adresses e-mail (votre adresse e-mail à la société) et de réinitialiser les mots de passe à sa guise. Les meilleures pratiques de ces jours-ci comprennent généralement une "confirmation" lien envoyé à l'adresse email de l'utilisateur, confirmant qu'ils veulent pour le réinitialiser. Ce lien est l'endroit où vous souhaitez envoyer la clé unique lien. J'ai envoyer le mien avec un lien du type:
domain.com/User/PasswordReset/xjdk2ms92
Oui, définir un délai d'attente sur le lien et de stockage de la clé et de délai d'attente sur votre backend (et de sel si vous utilisez un). Délais d'attente de 3 jours est la norme, et assurez-vous d'informer l'utilisateur de 3 jours au niveau du site web quand ils le demandent pour réinitialiser.
Utiliser une clé de hachage unique
Ma réponse précédente, a déclaré à l'utilisation d'un GUID. Je suis maintenant de l'édition de ce conseille à tous d'utiliser une générés aléatoirement de hachage, par exemple, à l'aide de la
RNGCryptoServiceProvider
. Et, assurez-vous d'éliminer toutes les "vrais mots" à partir de la table de hachage. Je me souviens d'un de spécial 6h appel téléphonique où une femme a reçu un certain "c" mot dans son "supposé être aléatoire" haché touche qu'un développeur n'. Doh!Ensemble de la procédure
RNGCryptoServiceProvider
, magasin comme une entité distincte dans unut_UserPasswordRequests
table et un lien de retour à l'utilisateur. Donc ce donc vous pouvez suivre les vieilles demandes et informe l'utilisateur que les anciens liens a expiré.Utilisateur obtient le lien, comme
http://domain.com/User/PasswordReset/xjdk2ms92
, et clique dessus.Si le lien est vérifié, vous demandez un nouveau mot de passe. Simple, et que l'utilisateur arrive à définir leur propre mot de passe. Ou, définir votre propre cryptique ici le mot de passe et de les informer de leur nouveau mot de passe ici (et l'envoyer par courriel à eux).
Tout d'abord, nous avons besoin de savoir ce que vous savez déjà au sujet de 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 e-mail? Avez-vous des données concernant l'utilisateur, la fleur préférée?
En supposant que vous avez un nom d'utilisateur, mot de passe et adresse e-mail valide, vous devez ajouter deux champs de votre table utilisateur (en supposant que c'est une table de base de données): un jour appelé new_passwd_expire et une chaîne new_passwd_id.
En supposant que vous avez l'adresse email de l'utilisateur, quand quelqu'un demande de réinitialisation de mot de passe, vous de modifier le tableau comme suit:
Ensuite, vous envoyez un e-mail de l'utilisateur à cette adresse:
Maintenant, codage yourscript.lang: Ce script a besoin d'un formulaire. Si le var mise à jour passées sur l'URL, le formulaire de demande pour le nom d'utilisateur et adresse e-mail. Si la mise à jour n'est pas passé, il demande le nom d'utilisateur, adresse e-mail et le code d'identification de l'envoyé dans l'e-mail. Vous aussi vous demander un nouveau mot de passe (deux fois bien sûr).
Pour vérifier que l'utilisateur est nouveau mot de passe, vous vérifiez le nom d'utilisateur, adresse e-mail et le code d'identification de tous les match, que la demande n'a pas expiré, et que les deux nouveaux mots de passe correspondent. En cas de succès, vous modifiez le mot de passe utilisateur pour le nouveau mot de passe et effacer le mot de passe réinitialiser les champs de la table user. Veillez aussi à déconnecter l'utilisateur/effacer tous les témoins de connexion et de rediriger l'utilisateur vers la page de connexion.
Essentiellement, le new_passwd_id champ est un mot de passe qui ne fonctionne que sur la page de réinitialisation de mot de passe.
Un potentiel d'amélioration: vous pouvez supprimer <username> à partir de l'email. "Quelqu'un doit demander une réinitialisation du mot de passe pour un compte à cette adresse e-mail...." Rendant ainsi le nom d'utilisateur quelque chose que l'utilisateur sait si l'email est intercepté. Je n'ai pas commencé de cette façon parce que si quelqu'un est d'attaquer le compte, ils connaissent déjà le nom d'utilisateur. Cela a ajouté de l'obscurité s'arrête man-in-the-middle attaques d'opportunité en cas de quelqu'un de malveillant arrive à intercepter le courrier électronique.
Que pour vos questions:
la génération de la chaîne aléatoire: Il n'a pas besoin d'être extrêmement aléatoire. Tout générateur de GUID ou même md5(concat(sel,current_timestamp())) est suffisante, où le sel est quelque chose sur l'enregistrement de l'utilisateur comme timestamp compte a été créé. Il doit être quelque chose que l'utilisateur ne peut pas voir.
minuterie: Oui, vous avez besoin de ce juste pour garder votre base de données sain d'esprit. Pas plus d'une semaine est vraiment nécessaire, mais au moins 2 jours puisque vous ne savez jamais combien de temps un e-mail de retard dernière.
Adresse IP: Depuis l'e-mail pourrait être retardée par jours, l'adresse IP n'est utile pour l'enregistrement, pas de validation. Si vous souhaitez l'enregistrer, de le faire, sinon vous n'en avez pas besoin.
Écran de réinitialisation: Voir ci-dessus.
Espérons qu'il couvre. Bonne chance.
Un GUID envoyé à l'adresse e-mail d'enregistrement est probablement suffisant pour la plupart des run-of-the-mill applications - délai d'attente encore mieux.
Après tout, si les utilisateurs de la boîte e-mail a été compromise(c'est à dire un hacker a l'ouverture de session/mot de passe de l'adresse e-mail), il n'y a pas beaucoup que vous pouvez faire à ce sujet.
Vous pouvez envoyer un e-mail à l'utilisateur avec un lien. Ce lien devrait contenir une dur de deviner chaîne (comme GUID). Sur le côté serveur, vous souhaite également de stocker la même chaîne que vous avez envoyé à l'utilisateur. Maintenant, lorsque l'utilisateur appuie sur le lien, vous pouvez trouver dans votre db entrée avec une même chaîne secrète et réinitialiser son mot de passe.
1) Pour la génération de l'identifiant unique que vous pourriez utiliser Secure Hash Algorithm.
2) minuteur de joint? Vouliez-vous dire une Échéance pour la remise pwd lien?
Oui, vous pouvez avoir une Expiration définie
3) Vous pouvez demander pour plus d'information autres que le emailId à valider..
Comme la date de naissance ou de certaines questions de sécurité
4) Vous pouvez également générer des caractères aléatoires et demandent à entrer que aussi avec la
demande.. assurez-vous que la demande de mot de passe n'est pas automatisée par certains logiciels espions ou des choses comme ça..
Je pense que Microsoft guide pour ASP.NET l'Identité est un bon début.
https://docs.microsoft.com/en-us/aspnet/identity/overview/features-api/account-confirmation-and-password-recovery-with-aspnet-identity
Code que j'utilise pour ASP.NET Identité:
Web.Config:
AccountController.cs: