Ich arbeite an einer Anwendung in ASP.NET und habe mich speziell gefragt, wie ich eine Password Reset
Funktion implementieren könnte, wenn ich meine eigene rollen möchte.
Insbesondere habe ich folgende Fragen:
- Was ist ein guter Weg, um eine eindeutige ID zu generieren, die schwer zu knacken ist?
- Sollte ein Timer daran angeschlossen sein? Wenn ja, wie lange sollte es dauern?
- Soll ich die IP-Adresse aufzeichnen? Ist es überhaupt wichtig?
- Welche Informationen sollte ich im Bildschirm "Passwort zurücksetzen" anfordern? Nur E-Mail-Adresse? Oder vielleicht eine E-Mail-Adresse und einige Informationen, die sie "kennen"? (Lieblingsteam, Name des Welpen usw.)
Gibt es noch andere Überlegungen, die ich beachten muss?
NB : Andere Fragen haben die technische Implementierung vollständig beschönigt . In der Tat beschönigt die akzeptierte Antwort die blutigen Details. Ich hoffe, dass diese Frage und die nachfolgenden Antworten in die blutigen Details eingehen, und ich hoffe, dass die Antworten, indem ich diese Frage viel enger formuliere, weniger "Flusen" und mehr "Gore" sind.
Bearbeiten : Antworten, die auch darauf eingehen, wie eine solche Tabelle in SQL Server oder in ASP.NET MVC-Links zu einer Antwort modelliert und verarbeitet wird, sind willkommen.
quelle
Antworten:
Viele gute Antworten hier, ich werde nicht die Mühe machen, alles zu wiederholen ...
Bis auf ein Problem, das von fast jeder Antwort hier wiederholt wird, obwohl es falsch ist:
Dies ist nicht der Fall. GUIDs sind sehr schwache Bezeichner und sollten NICHT verwendet werden, um den Zugriff auf das Konto eines Benutzers zu ermöglichen.
Wenn Sie die Struktur untersuchen, erhalten Sie höchstens 128 Bits ... was heutzutage nicht viel berücksichtigt wird.
Davon ist die erste Hälfte typisch invariant (für das Erzeugungssystem) und die Hälfte von dem, was übrig bleibt, ist zeitabhängig (oder etwas Ähnliches).
Alles in allem ist es ein sehr schwacher und leicht zu erzwingender Mechanismus.
Also benutze das nicht!
Verwenden Sie stattdessen einfach einen kryptografisch starken Zufallszahlengenerator (
System.Security.Cryptography.RNGCryptoServiceProvider
) und erhalten Sie mindestens 256 Bit Rohentropie.Alles andere, wie die zahlreichen anderen Antworten lieferten.
quelle
EDIT 2012/05/22: Im Anschluss an diese beliebte Antwort verwende ich selbst keine GUIDs mehr in diesem Verfahren. Wie die andere beliebte Antwort verwende ich jetzt meinen eigenen Hashing-Algorithmus, um den Schlüssel zum Senden der URL zu generieren. Dies hat den Vorteil, dass es auch kürzer ist. Schauen Sie in System.Security.Cryptography nach, um sie zu generieren. Normalerweise verwende ich auch ein SALZ.
Setzen Sie das Kennwort des Benutzers nicht sofort zurück.
Setzen Sie das Kennwort des Benutzers nicht sofort zurück, wenn er es anfordert. Dies ist eine Sicherheitsverletzung, da jemand E-Mail-Adressen (dh Ihre E-Mail-Adresse im Unternehmen) erraten und Kennwörter nach Belieben zurücksetzen kann. Zu den Best Practices gehört heutzutage normalerweise ein "Bestätigungs" -Link, der an die E-Mail-Adresse des Benutzers gesendet wird und bestätigt, dass er ihn zurücksetzen möchte. Über diesen Link möchten Sie den eindeutigen Schlüssellink senden. Ich sende meine mit einem Link wie:
domain.com/User/PasswordReset/xjdk2ms92
Ja, legen Sie eine Zeitüberschreitung für den Link fest und speichern Sie den Schlüssel und die Zeitüberschreitung in Ihrem Backend (und Salt, wenn Sie eine verwenden). Zeitüberschreitungen von 3 Tagen sind die Norm. Benachrichtigen Sie den Benutzer über 3 Tage auf Webebene, wenn er zum Zurücksetzen auffordert.
Verwenden Sie einen eindeutigen Hash-Schlüssel
In meiner vorherigen Antwort wurde die Verwendung einer GUID angegeben. Ich bearbeite dies jetzt, um jedem zu raten, einen zufällig generierten Hash zu verwenden, z
RNGCryptoServiceProvider
. B. mit dem . Und stellen Sie sicher, dass Sie keine "echten Wörter" aus dem Hash entfernen. Ich erinnere mich an einen speziellen 6-Uhr-Anruf, bei dem eine Frau ein bestimmtes "c" -Wort in ihrem Hash-Schlüssel "Angenommen, zufällig zu sein" erhalten hat, den ein Entwickler durchgeführt hat. Doh!Gesamtes Verfahren
RNGCryptoServiceProvider
, speichern ihn als separate Entität in einerut_UserPasswordRequests
Tabelle und verknüpfen ihn erneut mit dem Benutzer. Auf diese Weise können Sie alte Anfragen verfolgen und den Benutzer darüber informieren, dass ältere Links abgelaufen sind.Der Benutzer erhält den Link wie
http://domain.com/User/PasswordReset/xjdk2ms92
und klickt darauf.Wenn der Link überprüft wurde, fragen Sie nach einem neuen Passwort. Einfach, und der Benutzer kann sein eigenes Passwort festlegen. Oder legen Sie hier Ihr eigenes kryptisches Passwort fest und informieren Sie sie hier über ihr neues Passwort (und senden Sie es per E-Mail an sie).
quelle
Zunächst müssen wir wissen, was Sie bereits über den Benutzer wissen. Offensichtlich haben Sie einen Benutzernamen und ein altes Passwort. Was weißt du noch? Hast du eine Email adresse? Haben Sie Daten zur Lieblingsblume des Benutzers?
Angenommen, Sie haben einen Benutzernamen, ein Kennwort und eine funktionierende E-Mail-Adresse, müssen Sie Ihrer Benutzertabelle zwei Felder hinzufügen (vorausgesetzt, es handelt sich um eine Datenbanktabelle): ein Datum mit dem Namen new_passwd_expire und eine Zeichenfolge new_passwd_id.
Angenommen, Sie haben die E-Mail-Adresse des Benutzers. Wenn jemand ein Zurücksetzen des Kennworts anfordert, aktualisieren Sie die Benutzertabelle wie folgt:
Als Nächstes senden Sie eine E-Mail an den Benutzer unter folgender Adresse:
Codieren Sie jetzt Ihrecript.lang: Dieses Skript benötigt ein Formular. Wenn das var-Update die URL weitergegeben hat, werden im Formular nur der Benutzername und die E-Mail-Adresse des Benutzers abgefragt. Wenn das Update nicht bestanden wird, werden Sie nach Benutzername, E-Mail-Adresse und dem in der E-Mail gesendeten ID-Code gefragt. Sie fragen auch nach einem neuen Passwort (natürlich zweimal).
Um das neue Kennwort des Benutzers zu überprüfen, überprüfen Sie, ob Benutzername, E-Mail-Adresse und ID-Code übereinstimmen, ob die Anforderung nicht abgelaufen ist und ob die beiden neuen Kennwörter übereinstimmen. Bei Erfolg ändern Sie das Kennwort des Benutzers in das neue Kennwort und löschen die Felder zum Zurücksetzen des Kennworts aus der Benutzertabelle. Stellen Sie außerdem sicher, dass Sie den Benutzer abmelden / alle anmeldebezogenen Cookies löschen und den Benutzer auf die Anmeldeseite umleiten.
Im Wesentlichen ist das Feld new_passwd_id ein Kennwort, das nur auf der Seite zum Zurücksetzen des Kennworts funktioniert.
Eine mögliche Verbesserung: Sie können <Benutzername> aus der E-Mail entfernen. "Jemand hat ein Zurücksetzen des Passworts für ein Konto unter dieser E-Mail-Adresse angefordert ..." Damit wird der Benutzername nur dem Benutzer bekannt, wenn die E-Mail abgefangen wird. Ich habe nicht so angefangen, denn wenn jemand das Konto angreift, kennt er den Benutzernamen bereits. Diese zusätzliche Dunkelheit verhindert Man-in-the-Middle-Angriffe auf Gelegenheiten, falls jemand Böswilliges die E-Mail abfängt.
Wie für Ihre Fragen:
Generieren der zufälligen Zeichenfolge: Sie muss nicht extrem zufällig sein. Jeder GUID-Generator oder sogar md5 (concat (salt, current_timestamp ())) ist ausreichend, wenn Salt im Benutzerdatensatz etwas ist, wie ein Zeitstempelkonto erstellt wurde. Es muss etwas sein, das der Benutzer nicht sehen kann.
Timer: Ja, Sie benötigen dies nur, um Ihre Datenbank gesund zu halten. Nicht mehr als eine Woche ist wirklich notwendig, aber mindestens 2 Tage, da Sie nie wissen, wie lange eine E-Mail-Verzögerung dauern kann.
IP-Adresse: Da sich die E-Mail um Tage verzögern kann, ist die IP-Adresse nur für die Protokollierung und nicht für die Validierung nützlich. Wenn Sie es protokollieren möchten, tun Sie dies, andernfalls benötigen Sie es nicht.
Bildschirm zurücksetzen: Siehe oben.
Hoffe das deckt es ab. Viel Glück.
quelle
Eine GUID, die an die E-Mail-Adresse des Datensatzes gesendet wird, reicht wahrscheinlich für die meisten herkömmlichen Anwendungen aus - mit einer noch besseren Zeitüberschreitung.
Wenn die E-Mail-Box des Benutzers kompromittiert wurde (dh ein Hacker hat die Anmeldung / das Passwort für die E-Mail-Adresse), können Sie nicht viel dagegen tun.
quelle
Sie können dem Benutzer eine E-Mail mit einem Link senden. Dieser Link würde einige schwer zu erratende Zeichenfolgen enthalten (wie GUID). Auf der Serverseite würden Sie auch dieselbe Zeichenfolge speichern, die Sie an den Benutzer gesendet haben. Wenn der Benutzer auf den Link drückt, können Sie ihn in Ihrem Datenbankeintrag mit derselben geheimen Zeichenfolge finden und sein Passwort zurücksetzen.
quelle
1) Zum Generieren der eindeutigen ID können Sie den Secure Hash-Algorithmus verwenden. 2) Timer angeschlossen? Meinten Sie einen Ablauf für den zurückgesetzten pwd-Link? Ja, Sie können einen Ablaufsatz festlegen. 3) Sie können andere Informationen als die E-Mail-ID zur Validierung anfordern. Wie das Geburtsdatum oder einige Sicherheitsfragen. 4) Sie können auch zufällige Zeichen generieren und diese zusammen mit der Anfrage eingeben .. um sicherzustellen, dass die Passwortanforderung nicht durch Spyware oder ähnliches automatisiert wird ..
quelle
Ich denke, Microsoft Guide für ASP.NET Identity ist ein guter Anfang.
https://docs.microsoft.com/en-us/aspnet/identity/overview/features-api/account-confirmation-and-password-recovery-with-aspnet-identity
Code, den ich für die ASP.NET-Identität verwende:
Web.Config:
AccountController.cs:
quelle