Wygeneruj Tymczasowy adres URL, aby zresetować hasło

Chcę zaimplementować funkcję Zapomniałem hasła na mojej stronie. Podoba mi się opcja, w której e-mail zawierający tymczasowy jednorazowy adres URL, który wygasa po pewnym czasie, jest wysyłany do użytkownika.

Spojrzałem na następujące strony, aby uzyskać te pomysły, ale nie jestem pewien, jak wdrożyć to za pomocą ASP.NET i C#. Jak wskazał jeden z użytkowników, jeśli uda mi się to zaimplementować bez przechowywania tych informacji w bazie danych, będzie to idealne rozwiązanie. Proszę. doradzam.

Resetowanie hasła poprzez wysłanie e-maila z tymczasowymi hasłami

Dzięki.
Author: Community, 2009-12-31

9 answers

W zależności od potrzeb można szyfrować informacje w formacie zbliżonym do następującego formatu

(UserId)-(ExpireDate)

Zaszyfruj dane, Utwórz łącze, a następnie odszyfruj Dane i podejmij stamtąd działania...

Surowy, ale najprawdopodobniej użyteczny i nie wymagający użycia DB

 -3
Author: Mitchel Sellers,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-03 07:57:35

Prawdopodobnie najprostszym sposobem będzie zmodyfikowanie tabeli użytkowników, aby dodać 2 dodatkowe kolumny, lub jeśli nie chcesz modyfikować istniejącej tabeli, możesz dodać nową zależną tabelę o nazwie "UserPasswordReset" lub coś w tym stylu. Kolumny są takie:

PasswordResetToken UNIQUEIDENTIFIER,
PasswordResetExpiration DATETIME

Jeśli wybierzesz dodatkową trasę tabeli, możesz również dodać kolumnę UserID, uczynić ją kluczem podstawowym i odniesieniem do klucza foriegn z powrotem do tabeli użytkowników. Zalecane byłoby również unikalne ograniczenie. Wtedy ty wystarczy użyć Guid w swoim asp.net aplikacja jako token.

Przepływ może być coś takiego:

  1. użytkownik żąda zresetowania hasła do swojego konta
  2. wstawiasz nowy rekord w tabeli (lub aktualizujesz Rekord użytkownika), ustawiając PasswordResetExpiration na datę w przyszłości (DateTime.Teraz.AddDays(1)) i ustawić token na Guid.NewGuid ()
  3. Wyślij użytkownikowi link do ResetPassword.strona aspx z guid w ciągu zapytania ( http://www.yoursite.com/ResetPassword.aspx?token=Guid-here )
  4. Użyj ResetPassword.strona aspx do walidacji pól token i wygaśnięcie. (Tj. upewnij się, że DateTime.Now
  5. podaj prosty formularz, który pozwala użytkownikowi zresetować to hasło.
Wiem, że chciałeś uniknąć modyfikowania bazy danych, ale to chyba najprostsza metoda.
 61
Author: Scott Anderson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-31 15:35:55

@ Alex

Możesz również użyć systemu.Ochrona.Klasy kryptografii w. NET dla algorytmów hashowych. Na przykład:

using System.Security.Cryptography;
...
var hash = SHA256CryptoServiceProvider.Create().ComputeHash(myTokenToHash);
...
 2
Author: Rick Putnam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-10-11 18:34:49

Tutaj, System.Klasa Guid w Twoim przyjacielu, ponieważ wygeneruje unikalny (dobrze, wystarczająco unikalny) numer 128-bitowy:

  • wygeneruj nowy Guid (System.Guid.NewGuid ())
  • przechowywać gdzieś ten Guid (może obiekt aplikacji?)
  • Wyślij niestandardowy adres URL w wiadomości e-mail z tym identyfikatorem Guid
  • Gdy użytkownik wejdzie na stronę, wprowadź hasło wysłane w wiadomości e-mail
  • Jeśli hasła się zgadzają, zmuszaj je do wprowadzenia nowego hasła
 1
Author: Goyuix,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-31 15:31:28

Użyłem klasy Hashującej do tworzenia unikalnych automatycznych loginów składających się z bieżącej daty/godziny i adresu e-mail użytkownika:

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

Pobierz klasę Hash z: http://www.developerfusion.com/code/4601/create-hashes-md5-sha1-sha256-sha384-sha512/

Następnie po prostu weź go z adresu URL używając:

if (Request.QueryString["hash"] != null)
{
                //extract Hash from the URL
                string strHash = Request.QueryString["hash"];
}
 1
Author: Alex,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-24 17:09:35

Zdecydowanie włączyłbym w ten proces bazę danych. Po żądaniu resetu dobrym pomysłem jest wskazanie, że konto jest zablokowane.

Na przykład, jeśli zmieniasz pw, ponieważ uważasz, że Twoje konto zostało naruszone, zdecydowanie nie chcesz, aby pozostało dostępne podczas procesu zmiany.

Ponadto włączenie "prawdziwych" informacji w tokenie resetowania może być dekodowane, jeśli ktoś naprawdę chce i ma moc. Byłoby bezpieczniej jest wygenerować losowy ciąg znaków, zapisać go w db w wierszu dla tego użytkownika, a następnie powrócić do niego po kliknięciu łącza.

To daje dwie rzeczy:

1) nie ma nic do odszyfrowania, a zatem nic wartościowego nie można z niego uzyskać. 2) obecność tokena w rekordzie użytkownika wskazuje, że trwa Resetowanie i konto powinno być traktowane jako zablokowane.

 1
Author: user813006,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-26 20:28:00

Celem wysłania niektórych danych / ciągów do wiadomości e-mail użytkownika jest weryfikacja właściciela konta. Proszę o troskę o niektóre punkty:

  • unikaj wysyłania ważnych informacji w linku reset lub aktywuj.
  • to najlepszy sposób na przechowywanie unikalnych danych ciągów z użytkownikiem Konto i wyślij go jako ten link. ale pamiętaj, jeśli wyślesz tylko jeden sekcja jako link do e-maila użytkownika i po prostu sprawdź go na stronie, twój aplikacja może być niebezpieczna przez brute-force lub słownik napastnik. Wystarczy sprawdzić lista ciągów do znalezienia linków I zmienić hasło. Wiem, że to ma małe szanse, ale nie zero.

Wynik: I think it ' s better if you

  1. Połącz wiadomości e-mail użytkownika z linkiem łańcuchowym, a następnie Zaszyfruj je (nie hash, ponieważ wartość haszowana nie może być odwrócona) i wysłać do użytkownika e-mail.
  2. Kliknij użytkownika, a Twoja strona otrzyma zaszyfrowaną wartość.
  3. odszyfruj wartość.
  4. wyodrębnij e-mail użytkownika.
  5. Znajdź e-mail w bazie danych.
  6. porównaj łańcuch z otrzymanego linku z inne dołączone do użytkownika e-mail w bazie danych.

Powodzenia.

 0
Author: QMaster,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-02 08:57:11

Użyłbym kodu hashowego, aby zweryfikować szczegóły w adresie URL resetowania hasła. Wszystko to można zrobić bez zapisywania czegokolwiek do DB lub wysyłania jakichkolwiek uprzywilejowanych informacji do atakującego.

Aby krótko wyjaśnić normalne sól i hashowanie hasła; powiedzmy, że sól to 1111, a hasło to password, połączysz te dwa i skrócisz łańcuch 1111password, powiedzmy, że daje to hash 9999, następnie przechowasz oryginalny salt 1111 i hash 9999 w swoim rekordzie użytkownika.

Kiedy sprawdzasz hasło używasz przechowywanej soli, łączysz próbę hasła, mieszasz ją i porównujesz z przechowywanym skrótem. Na przykład asecret staje się 1111asecret, ale hashuje do 8888. To nie pasuje do oryginalnego hasha, więc hasło nie pasuje.

Oczywiście sól i hash normalnie byłyby poprawnie generowane i obliczane za pomocą ustalonych bibliotek kryptograficznych (nie wymyślaj własnych!).

Dla adresu URL resetowania hasła dodałbym unikalny identyfikator dla użytkownika, tj. adres e-mail, datę wniosek został złożony i Nowy hash. Ten hash byłby generowany z tych szczegółów połączonych razem oraz soli i hash już przechowywanych dla użytkownika.

Na przykład:

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

Wygeneruj nowy hash tych konkatenowanych, tzn. '[email protected]', powiedzmy, że daje to hash 7777.

Wygenerowany adres URL będzie zawierał adres e-mail, datę żądania i Nowy hash:

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

Serwer połączy e-mail i podaną datę z jego solą i Hashem i potwierdzi wygenerowany hash jest taki sam jak dostarczony. Jeśli to jest Ok, to wyświetli formularz resetowania z tymi samymi trzema parametrami ukrytymi za nim, w przeciwnym razie będzie to błąd. Są one ponownie wysyłane i sprawdzane po wprowadzeniu nowego hasła, aby zapobiec fałszowaniu formularza.

Adres e-mail musi zostać podany, aby złożyć wniosek i jest wysyłany tylko w wiadomości e-mail na ten sam adres. Data jest trudno priveleged info i hash nie jest odwracalny więc i tak nic nie daje. Nic nie zostało zapisane w bazie danych, a wszelkie manipulacje parametrami powodują, że hash nie działa, A adres URL zgłasza błąd.

 0
Author: Stephen Turner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-17 11:23:31

Jest problem z tym podejściem. Bezpieczny hash sprawia, że token jest naprawdę długi. Albo zintegrujesz sól z samym hashiem( wydłuża ją o 20%), albo przechowujesz tę unikalną sól w bazie danych. Jeśli przechowujesz salt w bazie danych, możesz równie dobrze zapisać losowy token, który nie jest derrived z żadnego istniejącego

 0
Author: Sandeep yadav,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-10 09:31:11