Skip to content

Instantly share code, notes, and snippets.

@gnaeus
Last active September 13, 2017 07:34
Show Gist options
  • Save gnaeus/ef9a37e29fe486f4c07a298adb849baf to your computer and use it in GitHub Desktop.
Save gnaeus/ef9a37e29fe486f4c07a298adb849baf to your computer and use it in GitHub Desktop.

Cookies: AUTH=payload.userId.rememberMe.timestamp; HttpOnly; XSRF-TOKEN=signarure;

AUTH – HttpOnly Session Cookie, выдается при логине, удаляется при выходе.

  • payload – данные пользователя, получаемые из БД на основе userId,
  • userId – идентификатор пользователя,
  • rememberMe – флаг "запомнить меня",
  • timestamp – время выпуска данной Cookie.

XSRF-TOKEN – Session Cookie, выдается, обновляется и удаляется строго вместе с AUTH Cookie.

  • signature – HMAC-подпись содержимого AUTH Cookie.
signature = HMAC ( secretKey, payload.userId.rememberMe.timestamp )

При формировании запроса на клиенте:

  1. Копируем значение Cookie XSRF-TOKEN из document.cookies в HTTP Header X-XSRF-TOKEN с помощью JavaScript.

При поступлении запроса на сервер:

  1. Если между timestamp и DateTime.Now больше 1 часа (или 2 недель при rememberMe == true), то возвращаем 401 Unauthorized. Причина: авторизационный токен просрочен.

  2. Если вычисленная заново HMAC-подпись содержимого AUTH Cookie не совпадает с signature из XSRF-TOKEN Cookie, то возвращаем 403 Forbidden. Причина: авторизационный токен имеет неверную подпись.

  3. Если значение HTTP Header X-XSRF-TOKEN не совпадает со значением XSRF-TOKEN Cookie, то возвращаем 403 Forbidden. Причина: неверный AntiForgery токен.

  4. Если между timestamp и DateTime.Now больше 5 минут, то пересчитываем payload из БД и перевыпускаем AUTH Cookie с новым timestamp. XSRF-TOKEN Cookie также перевыпускается с новой signature. Так обеспечивается актуальность payload и sliding expiration всех Cookie.

  • Если пользователь выбрал "запомнить меня", то AUTH и ХSRF-TOKEN становятся Persistent Cookie с Expires=DateTime.Now + 2 week;. При перевыпуске Cookies, тег Expires также обновляется (чтобы обеспечить sliding expiration).

  • Реальные периоды (5 минут, 1 час, 2 недели) берутся из настроек сервера.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment