Изменение частоты истечения объекта кэша ASP.NET?

Этот ответ основан на подходе без сохранения состояния, и поэтому в нем не говорится о традиционном управлении сеансами

Вы задали два совершенно разных вопроса:

    [ 1125] Корзина покупок - которая больше относится к бизнес-функциям
  1. OAuth 2 & amp; JWT - который связан с безопасностью и аутентификацией

Как пользователь веб-сайта электронной коммерции, я ожидаю, что любой товар, который я добавлю в свою корзину для покупок со своего мобильного устройства во время поездок на рабочее место, должен быть доступным в корзине, когда я захожу на сайт с моего компьютера после достижения дома. Таким образом, данные корзины должны быть сохранены во внутренней БД и связаны с моей учетной записью.

Когда речь заходит об аутентификации с использованием OAuth 2.0, токен доступа JWT и / или токен обновления необходимо хранить где-то на клиентском устройстве, поэтому, когда пользователь аутентифицирует себя, предоставляя учетные данные для входа, ему не нужно предоставлять его учетные данные снова, чтобы перемещаться по сайту. В этом контексте локальное хранилище браузера, сессионное хранилище и файлы cookie являются допустимыми параметрами. Однако обратите внимание, что здесь файл cookie не связан ни с одним сеансом на стороне сервера. Другими словами, cookie не хранит идентификатор сессии. Файл cookie просто используется в качестве хранилища для токена доступа, который передается на сервер при каждом http-запросе, и затем сервер проверяет токен с помощью цифровой подписи, чтобы убедиться, что он не был подделан и срок его действия не истек.

Хотя все три варианта хранения для доступа и / или обновления токенов популярны, cookie-файл представляется наиболее безопасным вариантом при правильном использовании.

Чтобы лучше это понять, я рекомендую вам прочитать это и это вместе со спецификацией OAuth 2.0.

Обновление: 16 февраля 2019 г.

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

Причина, по которой я думаю, что браузер localStorage и sessionStorage не обеспечивают достаточную безопасность для хранения токенов аутентификации, заключается в следующем:

  1. Если XSS возникает, вредоносный скрипт может легко прочитать токены оттуда и отправьте их на удаленный сервер. На удаленном сервере или злоумышленнике не возникнет проблем с выдачей себя за пользователя-жертву.

  2. localStorage и sessionStorage не являются общими для поддоменов. Таким образом, если у нас есть два SPA, работающих на разных поддоменах, мы не получим функцию единого входа, потому что токен, сохраненный одним приложением, не будет доступен для другого приложения в организации. Есть некоторые решения, использующие iframe, но они больше похожи на обходные пути, чем на хорошее решение. И когда заголовок ответа X-Frame-Options используется, чтобы избежать атак с использованием iframe кликджекинга, любое решение с iframe исключается.

Эти риски, однако, могут быть уменьшены путем использования отпечатка пальца (как упомянуто в Шпаргал OWASP JWT ), который, в свою очередь, также требует cookie.

Идея отпечатка пальца состоит в том, чтобы генерировать криптографически сильную случайную строку байтов. Строка Base64 необработанной строки будет затем сохранена в файле cookie HttpOnly, Secure, SameSite с префиксом имени __Secure-. Надлежащие значения для атрибутов домена и пути должны использоваться в соответствии с бизнес-требованиями. Хэш строки SHA256 также будет передан в заявке JWT. Таким образом, даже если атака XSS отправляет токен доступа JWT удаленному серверу, управляемому злоумышленником, он не может отправить исходную строку в файле cookie, и в результате сервер может отклонить запрос на основании отсутствия файла cookie. Файл cookie HttpOnly не может быть прочитан сценариями XSS.

Поэтому, даже когда мы используем localStorage и sessionStorage, мы должны использовать cookie, чтобы обеспечить его безопасность. Кроме того, мы добавляем ограничение субдомена, как упомянуто выше.

Теперь единственное беспокойство по поводу использования cookie для хранения JWT - это CSRF-атака. Поскольку мы используем cookie SameSite, CSRF смягчается, потому что межсайтовые запросы (AJAX или только через гиперссылки) невозможны. Если сайт используется в каком-либо старом браузере или некоторых других не очень популярных браузерах, которые не поддерживают cookie SameSite, мы все равно можем уменьшить CSRF, дополнительно используя файл cookie CSRF с криптографически сильным случайным значением, таким образом, что каждый запрос AJAX считывает cookie значение и добавьте значение cookie в пользовательский заголовок HTTP (за исключением запросов GET и HEAD, которые не должны изменять состояние). Поскольку CSRF не может читать что-либо из-за одной и той же политики происхождения и основан на использовании небезопасных методов HTTP, таких как POST, PUT и DELETE, этот файл CSRF уменьшит риск CSRF. Этот подход использования файла cookie CSRF используется всеми современными средами SPA. Угловой подход упоминается здесь , здесь .

Кроме того, поскольку cookie - это httpOnly и Secured, сценарий XSS не может его прочитать. Таким образом, XSS также смягчается.

Также стоит упомянуть, что внедрение XSS и сценариев может быть дополнительно уменьшено путем использования соответствующего content-security-policy заголовка ответа.

12
задан mdb 6 November 2008 в 16:45
поделиться

2 ответа

Ввод по абсолютному адресу вокруг с Отражателем показывает, что интервал является hardcoded. Истечение обрабатывается внутренним CacheExpires класс, статический конструктор которого содержит

_tsPerBucket = new TimeSpan(0, 0, 20);

_tsPerBucket readonly, таким образом, не может быть никакого параметра конфигурации, который изменяет его позже.

Таймер, который инициирует проверку на объекты с истекшим сроком, затем настраивается в CacheExpires.EnableExpirationTimer()...

DateTime utcNow = DateTime.UtcNow;
TimeSpan span = _tsPerBucket - new TimeSpan(utcNow.Ticks % _tsPerBucket.Ticks);
this._timer = new Timer(new TimerCallback(this.TimerCallback), null,
    span.Ticks / 0x2710L, _tsPerBucket.Ticks / 0x2710L);

Вычисление span гарантирует, что таймер стреляет точно в:00:20:40 секунд, хотя я не вижу причины обеспокоиться. Метод, который называет таймер, internal, таким образом, я не думаю, что существует любой способ настроить Ваш собственный таймер для вызова его чаще (игнорирующий отражение).

Однако хорошие новости - то, что у Вас не должно действительно быть причины заботиться об интервале. Cache.Get() проверки, что объект не истек, и если он имеет затем его, удаляют объект из кэша сразу и возвратов null. Поэтому Вы никогда не будете получать объект с истекшим сроком от кэша, даже при том, что объекты с истекшим сроком могут остаться в кэше в течение максимум 20 секунд.

19
ответ дан 2 December 2019 в 06:46
поделиться

Согласно документации, privateBytesPollTime для "использования памяти рабочего процесса", и значение по умолчанию составляет 1 секунду. Я не думаю, что это касается удаления объекта кэша.

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

2
ответ дан 2 December 2019 в 06:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: