2013-02-25 1 views
8

Ho l'obbligo di forzare un utente a cambiare la password dopo 90 giorni. Questo sta lavorando bene con qualcosa come il qui sotto:Arrestare l'utente dall'utilizzo della password dell'ultima 5?

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

Tuttavia un altro requisito che ho è che l'ultimo 5 password che l'utente ha utilizzato non può essere ripetuto - non asp.net venire con qualcosa di simile costruito nel? Non riesco a vedere nulla nella tabella db di aspnet in cui sono archiviate le ultime password precedenti. Sarà una questione di me memorizzare gli ultimi valori della password nella mia tabella db e quindi fare un confronto con il nuovo campo password inserito rispetto ai valori per l'utente nella mia tabella db personalizzata?

+1

Sì, devi farlo da solo ma non hai bisogno di creare alcuna tabella _custom_ DB per memorizzare vecchie password/hash, semplicemente usa una proprietà profilo (dove memorizzi vecchie password/hash in a, per esempio , elenco separato da virgola). –

+0

No, l'appartenenza a asp.net non ha questa funzione. Dovrai implementarlo. Ma non memorizzare le password, memorizzare gli hash. – Anri

risposta

13

Come hai notato, non c'è nulla di integrato, quindi dovrai memorizzare le password precedenti per un utente e controllare quell'elenco per assicurarti che non lo riutilizzino.

Conserverei tutte le password precedenti. Ciò significa che non è necessario cancellare i vecchi dati dalla tabella quando hanno raggiunto 5 modifiche e se il requisito cambia per non riutilizzare le ultime 10 o 15 modifiche, i dati saranno disponibili.

È possibile memorizzare la password crittografata/crittografata e verificare che non ci sia alcuna possibilità di estrarre la versione in testo normale dal proprio sistema.

Avrei una tabella di "UserId", "Password" e "DateChanged". Quindi è possibile trovare gli ultimi password N per questo utente e confrontare la versione hash/crittografata della nuova password contro questa lista:

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); 

Ciò restituisce true se la password è stata già utilizzata.

+0

quindi creeresti una nuova colonna nel db per ogni password? Quale sarebbe il modo migliore nel codice per confrontare il valore eneterd con i valori hash memorizzati? Diciamo che inserisco test1234 nel campo sullo schermo come la mia nuova password - come potrei confrontare i valori hash con i valori nel db? –

+1

@KOL Avrei una tabella di "UserId", "Password" e "DateChanged". Quindi puoi trovare le ultime N password per questo utente e confrontare la versione hash/crittografata della nuova password con questo elenco. – ChrisF

+0

Molte grazie per le tue modifiche - non era a conoscenza del metodo MembershipProvider.Encrypt - funzionerà se ho usato la password con sale come formato? (Ad esempio, il formato della password nella mia tabella di appartenenza in aspnet db è 1) –