it-swarm.com.de

Temporäre URL zum Zurücksetzen des Passworts generieren

Ich möchte eine Funktion "Passwort vergessen" auf meiner Website implementieren. Ich mag die Option, bei der eine E-Mail mit einer temporären URL für die einmalige Verwendung, die nach einiger Zeit abläuft, an den Benutzer gesendet wird. 

Ich habe auf den folgenden Seiten nach diesen Ideen gesucht, bin aber nicht sicher, wie ich dies mit ASP.NET und C # implementieren kann. Wie einer der Benutzer anzeigte, wäre dies ideal, wenn ich dies implementieren kann, ohne diese Informationen in der Datenbank zu speichern. Bitte beraten.

Passwort zurücksetzen durch E-Mail an temporäre Passwörter

Vielen Dank.

27
Pratik Kothari

Der einfachste Weg besteht wahrscheinlich darin, die Benutzertabelle so zu ändern, dass zwei zusätzliche Spalten hinzugefügt werden, OR. Wenn Sie die vorhandene Tabelle nicht ändern möchten, können Sie eine neue abhängige Tabelle mit dem Namen "UserPasswordReset" oder etwas anderes hinzufügen so wie das. Die Spalten sind wie folgt:

PasswordResetToken UNIQUEIDENTIFIER,
PasswordResetExpiration DATETIME

Wenn Sie mit der zusätzlichen Tabellenroute fortfahren, können Sie auch die UserID-Spalte hinzufügen, sie als Primärschlüssel und als Foriegn-Schlüsselreferenz zurück in Ihre Benutzertabelle setzen. Eine UNIQUE-Einschränkung würde ebenfalls empfohlen. Dann verwenden Sie einfach eine Guid in Ihrer asp.net-Anwendung als Token.

Der Fluss könnte so aussehen:

  1. Benutzer fordert das Zurücksetzen des Kennworts für sein Konto an
  2. Sie fügen einen neuen Datensatz in die Tabelle ein (oder aktualisieren ihren Benutzerdatensatz), indem Sie PasswordResetExpiration auf ein Datum in der Zukunft setzen (DateTime.Now.AddDays (1)) und das Token auf Guid.NewGuid () setzen.
  3. Senden Sie dem Benutzer einen Link zu Ihrer ResetPassword.aspx-Seite mit der Guid in der Abfragezeichenfolge ( http://www.yoursite.com/ResetPassword.aspx?token=Guid-here ).
  4. Verwenden Sie die Seite ResetPassword.aspx, um die Token- und Ablauffelder zu überprüfen. (I.E. Stellen Sie sicher, dass DateTime.Now <PasswordResetExpiration ist)
  5. Geben Sie ein einfaches Formular an, mit dem der Benutzer dieses Kennwort zurücksetzen kann.

Ich weiß, dass Sie die Datenbank nicht modifizieren wollten, aber es ist wahrscheinlich die einfachste Methode.

64
Scott Anderson

@Alex

Sie können in .NET auch System.Security.Cryptography-Klassen für die Hash-Algorithmen verwenden. Zum Beispiel:

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

Ich würde die Datenbank definitiv in diesen Prozess einbeziehen. Sobald ein Reset angefordert wird, empfiehlt es sich, anzugeben, dass das Konto gesperrt ist. 

Wenn Sie z. B. Ihren pw ändern, weil Sie der Meinung sind, dass Ihr Konto möglicherweise gefährdet ist, möchten Sie definitiv nicht, dass er während des Änderungsprozesses erreichbar bleibt.

Die Aufnahme "echter" Informationen in den Reset-Token könnte auch dekodiert werden, wenn jemand es wirklich will und die Leistung hat. Es ist sicherer, eine zufällige Zeichenfolge zu generieren, sie in der Datenbank in der Zeile dieses Benutzers zu speichern und sie dann wieder einzugeben, wenn auf den Link geklickt wird.

Dies gibt Ihnen zwei Dinge:

1) Es gibt nichts zu entschlüsseln und daher kann nichts von Wert gewonnen werden. 2) Das Vorhandensein des Tokens im Benutzerdatensatz zeigt an, dass das Zurücksetzen ausgeführt wird und das Konto als gesperrt betrachtet werden sollte.

1
user813006

Hier die System.Guid-Klasse in Ihrem Freund, da diese eine eindeutige (gut genug) 128-Bit-Zahl generiert:

  • Erzeugen Sie eine neue Guid (System.Guid.NewGuid ())
  • Diese Guid irgendwo speichern (Anwendungsobjekt vielleicht?)
  • Senden Sie eine benutzerdefinierte URL in einer E-Mail mit dieser Guid
  • Wenn der Benutzer die Site besucht, geben Sie das Passwort ein, das Sie in der E-Mail gesendet haben
  • Wenn die Passwörter übereinstimmen, können Sie ein neues Passwort eingeben
1
Goyuix

Ich habe eine Hashing-Klasse verwendet, um eindeutige automatische Anmeldungen zu erstellen, die sich aus dem aktuellen Datum und der aktuellen Uhrzeit sowie der E-Mail-Adresse des Benutzers zusammensetzen:

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

holen Sie sich die Hash-Klasse von: http://www.developerfusion.com/code/4601/create-hashes-md5-sha1-sha256-sha384-sha512/

Dann nehmen Sie es einfach von der URL mit:

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

Das Senden einiger Datenzeichenfolgen an die E-Mail-Adresse eines Benutzers ist die Überprüfung des Kontoinhabers. Bitte beachten Sie einige Punkte:

  • Vermeiden Sie das Versenden wichtiger Informationen beim Zurücksetzen oder Aktivieren des Links.
  • Es ist am besten, eindeutige Zeichenfolgendaten mit dem Konto Des Benutzers zu speichern und als diesen Link zu senden. Seien Sie sich jedoch bewusst, wenn Sie nur einen Abschnitt als Link zur E-Mail des Benutzers senden und einfach auf der Seite einchecken. Ihre Anwendung kann durch Brute-Force- oder Wörterbuch-Angreifer in Gefahr sein. Es reicht aus, eine Liste von Zeichenfolgen zu überprüfen, um einige Links Zu finden und das Kennwort zu ändern. Ich weiß, das hat eine kleine Chance, aber nicht Null.

Ergebnis: Ich finde es besser, wenn Sie 

  1. benutzer-E-Mail mit String-Link kombinieren, dann verschlüsseln (kein Hash, da Hashwert nicht umgekehrt werden kann) und an Benutzer E-Mail senden.
  2. Benutzer klicken und Ihre Seite erhält den verschlüsselten Wert.
  3. wert entschlüsseln.
  4. benutzer-E-Mail extrahieren.
  5. e-Mail in der Datenbank finden.
  6. vergleichen Sie die Zeichenfolge aus dem erhaltenen Link mit einer anderen, die der E-Mail des Benutzers in der Datenbank angehängt ist.

Viel Glück.

0
QMaster

Ich würde einen Hashcode verwenden, um Details in der URL zum Zurücksetzen des Kennworts zu überprüfen. Dies kann alles getan werden, ohne etwas an die Datenbank zu schreiben oder privilegierte Informationen an einen Attaker zu senden.

Um das normale Passwort Salt und Hashing kurz zu erklären; Angenommen, der Salt ist 1111 und das Kennwort ist password, Sie würden die beiden verketten und die Zeichenfolge 1111password anhängen, sagen, dies gibt Ihnen einen Hash von 9999, Sie würden dann den ursprünglichen Salt 1111 und den Hash 9999 in Ihrem Benutzerdatensatz speichern. 

Wenn Sie ein Kennwort überprüfen, verwenden Sie das gespeicherte Salt, verketten Sie den Kennwortversuch, markieren Sie es und vergleichen Sie es mit dem gespeicherten Hash. Zum Beispiel wird asecret zu 1111asecret, aber Hashes zu 8888. Dies stimmt nicht mit dem ursprünglichen Hash überein, daher schlägt die Passwortübereinstimmung fehl.

Natürlich werden das Salt und Hash normalerweise mit etablierten Kryptobibliotheken ordnungsgemäß generiert und berechnet (nicht selbst erfinden!).

Für die URL zum Zurücksetzen des Passworts würde ich die eindeutige Kennung für den Benutzer eingeben, d. H. Die E-Mail-Adresse, das Datum der Anforderung und einen neuen Hash. Dieser Hashwert wird aus den zusammengebundenen Details sowie dem bereits für den Benutzer gespeicherten Salt- und Hashwert generiert.

Zum Beispiel:

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

Erzeugen Sie einen neuen Hash der verketteten, d. H. '[email protected]', sagen Sie, dies ergibt einen Hash von 7777.

Die URL, die ich dann generiere, hätte dann die E-Mail, das Anfragedatum und den neuen Hash:

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

Der Server kombiniert die E-Mail und das gelieferte Datum mit Salt und Hash und bestätigt, dass der generierte Hash derselbe ist wie der angegebene. Wenn dies Ok ist, wird das Rücksetzformular mit den gleichen drei hinterlegten Parametern angezeigt, andernfalls ein Fehler. Diese werden erneut übermittelt und bei der Eingabe des neuen Kennworts überprüft, um zu verhindern, dass dieses Formular gefälscht wird. 

Die E-Mail-Adresse muss angegeben werden, um die Anfrage zu stellen. Sie wird nur in einer E-Mail an dieselbe Adresse gesendet. Das Datum ist kaum privilegiert und der Hash ist nicht umkehrbar, also gibt es sowieso nichts. Es wurde nichts in die Datenbank geschrieben, und bei einer Manipulation der Parameter schlägt der Hash fehl und die URL meldet einen Fehler.

0
Stephen Turner

Bei diesem Ansatz gibt es Probleme. Ein sicherer Hash macht das Token wirklich lang. Entweder integrieren Sie das Salt in den Hash selbst (um etwa 20 Zeichen länger), oder Sie speichern dieses einzigartige Salt in der Datenbank. Wenn Sie den Salt in der Datenbank speichern, können Sie auch ein zufälliges Token speichern, das von keinem vorhandenen abgelöst wird 

0
Sandeep yadav