2013-02-25 2 views
8

У меня есть требование заставить пользователя сменить пароль после 90 дней. Это работает хорошо с чем-то вроде ниже:Остановить пользователя от использования последнего 5 пароля?

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

Однако еще одно требование, что у меня есть, что последние 5 паролей пользователь использовал не может быть повторена - это asp.net приходят с чем-нибудь похожее на это? Я не вижу ничего в таблице db aspnet, где хранятся предыдущие предыдущие пароли. Будет ли это вопросом, хранящим последние значения пароля в моей собственной таблице db, а затем выполнив сравнение с новым полем пароля, введенным со значениями для пользователя в моей собственной таблице db?

+1

Да, вы должны сделать это самостоятельно, но вам не нужно создавать какую-либо таблицу _custom_ DB для хранения старых паролей/хэшей, просто используйте свойство профиля (где вы храните старые пароли/хэши в a, например , список, разделенный запятыми). –

+0

Нет, членство asp.net не имеет этой функции. Вам придется его реализовать. Но не храните пароли, храните хэши. – Anri

ответ

13

Как вы заметили, нет ничего встроенного, поэтому вам придется хранить предыдущие пароли для пользователя и проверять этот список, чтобы убедиться, что они не используют его повторно.

Я бы сохранил все свои предыдущие пароли. Это означает, что вам не нужно удалять старые данные из таблицы, когда они нажимают 5 изменений, и если требование изменится, чтобы не повторно использовать последние 10 или 15 изменений, у вас будут данные.

Вы можете сохранить хэшированный/зашифрованный пароль и проверить, что нет возможности получить версию обычного текста из вашей системы.

У меня будет таблица «UserId», «Password» и «DateChanged». Тогда вы можете найти последние N паролей для этого пользователя и сравнить хэш/зашифрованную версию нового пароля по этому списку:

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

Это возвращает истину, если пароль был использован уже.

+0

, так что бы вы создали новый столбец в db для каждого пароля? Каким будет лучший способ в коде для сравнения значений eneterd с хэш-значениями? Скажем, я ввел test1234 в поле на экране в качестве моего нового пароля - как бы сравнить хэш-значения со значениями в db? –

+1

@KOL У меня будет таблица «UserId», «Password» и «DateChanged». Затем вы можете найти последние N паролей для этого пользователя и сравнить хешированную/зашифрованную версию нового пароля с этим списком. – ChrisF

+0

Большое спасибо за ваши изменения - не знал о методе MembershipProvider.Encrypt - будет ли это работать, если я использовал пароль с солью в качестве своего формата? (т. е. формат пароля в моей таблице членства в aspnet db равен 1) –

Смежные вопросы