Могу ли я сделать свой файл cookie ASP.NET FormsAuthentication более безопасным, связав его с идентификатором сеанса? - PullRequest
6 голосов
/ 23 апреля 2009

Мы заметили, что можно воссоздать копию файла cookie ASP.NET FormsAuthentication на другом компьютере, позволяя второму компьютеру проходить проверку подлинности без необходимости входа в систему.

Одним из предлагаемых решений этой проблемы было сохранение идентификатора сеанса в FormsAuthenticationTicket.UserData и проверка соответствия двух значений внутри Application_AuthenticateRequest().

Мы используем:

FormsAuthenticationTicket.IsPersistent = false;

Является ли такой подход связывания файла cookie FormsAuthentication с идентификатором сеанса хорошей идеей?

1 Ответ

19 голосов
/ 23 апреля 2009

Я думаю, что вы переосмысливаете проблему. Возможность копировать cookie-файлы - это просто неотъемлемая проблема cookie-файлов: любой может перехватить любой cookie-файл и выдать себя за любые имеющиеся данные, настроив их на другом компьютере.

«Безопасность» куки-файла аутентификации обусловлена ​​тем фактом, что никто не может (предположительно) вручную создать куки-файл для фальсификации аутентифицированного пользователя. Однако, как только файл cookie создан, он может быть использован для аутентификации. Это означает, что для того, чтобы ваша «проблема» возникла, вам все равно нужно сначала войти в систему. Если этот пользователь злоупотребляет системой, копируя свои cookie-файлы на другие машины, чтобы предоставить всем доступ, это то же самое, что и пользователь, просто сообщающий всем свои имя пользователя и пароль, за исключением гораздо более тупых. Следовательно, проблема не в копировании куки, а в самом пользователе.

Еще один вектор атаки может быть связан с тем, что сеть взломана, и кто-то может перехватить трафик, чтобы соединить cookie с помощью сниффера или чего-либо еще, но опять же, это присуще самим cookie. Это называется Session Hijacking, и единственный способ защититься от этого - использовать SSL для вашего сайта.

Если вы действительно беспокоитесь об этом, я бы просто установил одинаковые значения времени ожидания для вашей аутентификации и сеанса, а затем в вашем файле global.asax просто вызывал FormsAuthentication.Signout () каждый раз, когда истекает сеанс пользователя. Это лишает законной силы аутентификацию всякий раз, когда пользователь завершает свой сеанс, заставляя его войти в систему позже. Конечно, это может быть крайне раздражающим для ваших пользователей ...

Я также очень рекомендую Эта статья MSDN . Вероятно, он отвечает на ваши вопросы намного лучше, чем я.

...