2013-02-25 10 views
8

Mam wymóg zmuszenia użytkownika do zmiany hasła po 90 dniach. To działa dobrze z czymś jak poniżej:Zatrzymać użytkownika przed użyciem 5 ostatnich haseł?

if (memberUser.LastPasswordChangedDate.Date.AddDays(90) < DateTime.Now.Date) 
{ 
    return RedirectToAction("MyChangePasswordMethod", "MyController"); 
} 

Jednak kolejny wymóg, że mam to, że ostatnie 5 haseł użytkownik wykorzystał nie mogą się powtarzać - nie asp.net pochodzić z czymś takim wbudowany? Nie widzę niczego w tabeli dbnet db, gdzie przechowywane są ostatnie poprzednie hasła. Czy będzie to dla mnie kwestia przechowywania ostatnich wartości hasła w mojej własnej tabeli db, a następnie porównywania z nowym polem hasła wpisanym z wartościami dla użytkownika w mojej własnej niestandardowej tabeli db?

+1

Tak, musisz zrobić to samemu, ale nie musisz tworzyć żadnej tabeli _custom_ DB do przechowywania starych haseł/skrótów, po prostu użyj właściwości profilu (gdzie przechowujesz stare hasła/hasze w a, na przykład , rozdzielana przecinkami lista). –

+0

Nie, członkostwo asp.net nie ma tej funkcji. Będziesz musiał to zaimplementować. Ale nie przechowuj haseł, przechowuj haszy. – Anri

Odpowiedz

13

Jak już zauważyłeś, nic nie jest wbudowane, więc będziesz musiał przechowywać poprzednie hasła dla użytkownika i sprawdzić tę listę, aby upewnić się, że nie są używane ponownie.

Zapisałbym wszystkie poprzednie hasła. Oznacza to, że nie musisz usuwać starych danych z tabeli, gdy trafią 5 zmian, a jeśli wymóg ten zostanie zmieniony, aby nie ponownie użyć ostatnich 10 lub 15 zmian, otrzymasz dane.

Możesz przechowywać hashowane/zaszyfrowane hasło i sprawdzić, czy nie ma szansy na usunięcie z systemu wersji tekstowej.

Chciałbym mieć tabelę "UserId", "Password" i "DateChanged". Następnie można znaleźć ostatnie haseł N dla tego użytkownika i porównać zaszyfrowany/zaszyfrowany wersję nowego hasła przeciwko tej listy:

var encryptedPassword = MembershipProvider.EncryptPassword(password); 
int numberOfReuse = 5; // or configurable 
var historiesQuery = (from histories in dataContext.GetTable<PasswordHistory>() 
         where histories.UserId == userId 
         orderby histories.PasswordDate descending 
         select histories.Password).Take<string>(numberOfReuse); 

return historiesQuery.Contains<string>(enycryptedPassword); 

ta zwraca wartość true, jeśli hasło zostało już wykorzystane.

+0

więc utworzyć nową kolumnę w db dla każdego hasła? Jaki byłby najlepszy sposób w kodzie do porównywania wartości wprowadzonych do wartości mieszania? Powiedzmy, że wpisuję test1234 w polu na ekranie jako moje nowe hasło - jak porównałbym wartości mieszania z wartościami w db? –

+1

@KOL Chciałbym mieć tabelę "UserId", "Password" i "DateChanged". Następnie możesz znaleźć ostatnie N haseł dla tego użytkownika i porównać hashowaną/zaszyfrowaną wersję nowego hasła z tą listą. – ChrisF

+0

Wielkie dzięki za zmiany - nie znałeś metody MembershipProvider.Encrypt - czy to zadziała, jeśli użyję hasła z solą jako mojego formatu? (tj. format hasła w mojej tabeli członkowskiej w aspnet db to 1) –

Powiązane problemy