Ответ 1
Это не делает IsAuthenticated
дырой безопасности. Давайте посмотрим на фактический процесс аутентификации.
-
Вы настраиваете некоторые вещи в своем web.config, где находится страница входа в систему, как долго логин подходит и нужно ли использовать скользящее завершение (если время будет расширено, если пользователь активен на вашем сайт)
-
Пользователь приходит на ваш сайт, вводит имя пользователя и пароль.
-
Эта информация отправляется на ваш сервер. Вы берете эту информацию, проверяете ее правильность (аутентификацию). Если это правильно, сервер затем выдает зашифрованный файл cookie, известный как
FormsAuthenticationTicket
Примечание - это может иметь другое имя в новом материале Identity, но тот же принцип. -
Содержимое cookie включает такие элементы, как имя пользователя и дата истечения срока действия логина.
-
По каждому запросу сервер просматривает коллекцию файлов cookie для файла cookie аутентификации. Если он найден, он расшифровывает его, считывает значения и определяет, является ли это по-прежнему действительным cookie (время истечения). После получения пользовательской информации из файла cookie сервер может использовать эту информацию, чтобы определить, разрешен ли пользователь для запрашиваемого ресурса (поиск по имени пользователя).
5а. Если файл cookie отсутствует или он истек, то пользователь перенаправляется обратно на страницу входа.
6. Когда пользователь выходит из системы, cookie удаляется из коллекции файлов cookie. Теперь, если пользователь пытается перейти на ресурс только для авторизованных пользователей, тогда сервер заканчивается на 5а выше.
Итак, в вашем случае вы удалили пользователя вручную. Это не меняет того факта, что этот пользователь ранее был аутентифицирован с помощью все еще актуального файла cookie. Поэтому IsAuthenticated
возвращает ожидаемое значение. Перед изменением статуса пользователя пользователь выполнил аутентификацию. IsAuthenticated
не означает, что этот пользователь по-прежнему действителен в моей базе данных.
Если вы собираетесь запускать сайт, на котором вы постоянно удаляете/деактивируете пользователей, переопределите метод OnRequestAuthorization
AuthorizeAttribute
, чтобы посмотреть, действительно ли пользователь все еще находится в базе данных. Кроме того, обратите внимание, что если имя пользователя отсутствует (потому что вы его удалили), то любые запросы на роль role/userId не удастся. Вы можете поймать это исключение/сбой и вернуть неавторизованный ответ свойства.