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 )
При формировании запроса на клиенте:
- Копируем значение Cookie XSRF-TOKEN из
document.cookies
в HTTP Header X-XSRF-TOKEN с помощью JavaScript.
При поступлении запроса на сервер:
-
Если между
timestamp
иDateTime.Now
больше 1 часа (или 2 недель приrememberMe == true
), то возвращаем401 Unauthorized
. Причина: авторизационный токен просрочен. -
Если вычисленная заново HMAC-подпись содержимого AUTH Cookie не совпадает с
signature
из XSRF-TOKEN Cookie, то возвращаем403 Forbidden
. Причина: авторизационный токен имеет неверную подпись. -
Если значение HTTP Header X-XSRF-TOKEN не совпадает со значением XSRF-TOKEN Cookie, то возвращаем
403 Forbidden
. Причина: неверный AntiForgery токен. -
Если между
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 недели) берутся из настроек сервера.