Идентификатор идентичности ASP.Net. Идентифицированный идентификатор остается верным, даже после удаления пользователя

Я выполнил идентификацию ASP.Net после следующего примера кода: https://github.com/rustd/AspnetIdentitySample

В моей реализации я проверяю, аутентифицирован ли пользователь - это вызвано из FilterAttribute на моих MVC-контроллерах; идея заключается в том, что я хочу подтвердить, что они все еще авторизованы, прежде чем обслуживать страницу.

Итак, в моем фильтре в конечном итоге вызывается следующий код:

_authenticationManager.User.Identity.IsAuthenticated;

_authenticationManager находится здесь:

private IAuthenticationManager _authenticationManager
{
    get
    {
        return _httpContext.GetOwinContext().Authentication;
    }
}

_httpContext передается в конструктор моего класса identityProvider.

Теперь - когда я вошел в систему, _authenticationManager.User.Identity.IsAuthenticated; возвращает true, как ожидалось.

Однако во время разработки я сбрасывал и повторно загружал свою базу данных, не добавляя пользователя. Таким образом, я удалил IdentityUser, но _authenticationManager.User.Identity.IsAuthenticated; STILL возвращает true

любая идея, почему это так? Я могу только предположить, что это как-то проверяет файл cookie, а не фактически смотрит на БД. это верно?

Или я испортил свою реализацию.....

Ответ 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 не удастся. Вы можете поймать это исключение/сбой и вернуть неавторизованный ответ свойства.