ОК, здесь сценарий:
- Боб записывается в mysite.com, который использует аутентификацию .NET-форм, и тикает "помни меня".
- Ева крадет ноутбук Боба
- Боб получает новый ноутбук и меняет свой пароль.
Теперь на данный момент у Eve есть украденный ноутбук, на котором хранится постоянный файл cookie, который будет записывать ее на mysite.com, как Bob, - и, насколько я могу судить, это будет работать даже после того, как Bob изменил свой пароль.
По умолчанию cookie проверки подлинности форм не содержит пароля Боба (будь то открытый, хэшированный или иным образом зашифрованный), поэтому пароль Боба вообще не задействован в процессе аутентификации cookie и то же имя пользователя, которое работало на прошлой неделе будет по-прежнему работать сегодня.
Это достаточно простая лазейка для работы - просто установив FormsAuthentication.SetAuthCookie( "username: passwordHash" ) или что-то, а затем расшифровывая и разбивая куки файлы в вашем обработчике проверки подлинности, но я не могу поверить, что эта проблема существует "из ящик?... я что-то упустил?
РЕДАКТИРОВАТЬ. Обратите внимание, что я предполагаю, что цель кнопки "запомнить меня" - это запретить вам вводить пароль каждый раз, когда вы посещаете веб-сайт. Это работает на Facebook, Twitter, Gmail и практически на каждом другом сайте, о котором я могу думать, - и я был бы очень удивлен, если это не цель опции "Постоянный куки" в .NET FormsAuthentication.
Кроме того, да, я согласен с тем, что выполнение двухфакторной аутентификации при каждом входящем запросе несет определенные накладные расходы, но в реальном выражении это лишь незначительно дороже, чем извлечение пользователя из базы данных на основе их имени пользователя, которое вы, вероятно, все равно.
РЕДАКТИРОВАТЬ 2. Похоже, что по крайней мере один основной сайт .NET - CodePlex.com - уязвим для этого; см. http://codeplex.codeplex.com/discussions/350646