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