Форум программистов, компьютерный форум, киберфорум
Наши страницы
C#: ASP.NET Core
Войти
Регистрация
Восстановить пароль
 
Casper-SC
Эксперт .NET
4094 / 1944 / 381
Регистрация: 27.03.2010
Сообщений: 5,345
Записей в блоге: 1
1

Не сохраняются куки в браузере, если веб-приложение залито на VPS (Ubuntu 18.04.3) и работает через Nginx

19.01.2020, 00:23. Просмотров 384. Ответов 6

ASP.NET Core Web API + React JS (SPA)

Всем привет. Такой вопрос. Кто-нибудь вообще когда-то сталкивался с тем, что не сохраняются куки? Куки не просрочены. Вот локально отлаживаешь приложение, куки сохраняются, а если не локально, то браузер получает заголовки Set-Cookie, но не сохраняет. Для начала меня интересует, сталкивался ли кто-то с таким и по каким причинам такое возможно? Может ли это быть из-за прокси сервера Nginx? Кстати, веб-приложение работает без шифрования, локально дебажится с шифрованием. Но сам API работает, я спокойно перехожу на страницу аутентификации и ввожу логин и пароль, а вот дальше я получаю ответ с куками, они не сохраняются, потом обращаюсь к методу, который требует быть залогиненым, и следовательно получаю Status Code: 401 Unauthorized.

Добавлено через 5 минут
Метод, требующий авторизации
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    [Route("api")]
    [Authorize]
    [ApiController]
    public class SearchController : ControllerBase
    {
        [HttpGet]
        [Route("search")]
        [ProducesResponseType(StatusCodes.Status200OK)]
        [ProducesResponseType(StatusCodes.Status400BadRequest)]
        public async Task<IActionResult> Search([FromQuery(Name = "type_of_query")]QueryType queryType)
        {
             // ...
        }
 
        // ...
    }
Добавлено через 9 минут
Вот такие заголовки приходят в ответе от сервера в браузер (данные в куках обрезал, чтобы читабельнее было)
Cache-Control: no-cache
Connection: keep-alive
Content-Encoding: gzip
Content-Type: application/json; charset=utf-8
Date: Sat, 18 Jan 2020 20:43:26 GMT
Expires: Thu, 01 Jan 1970 00:00:00 GMT
Pragma: no-cache
Server: nginx/1.14.0 (Ubuntu)
Set-Cookie: .AspNetCore.Identity.Application=CfDJ8FG6Anf1vpBAjf7Y4rsmh5bG; expires=Sat, 01 Feb 2020 20:43:26 GMT; path=/; secure; samesite=lax; httponly
Set-Cookie: .AspNetCore.Application.Id=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVC; max-age=3600; path=/; secure; samesite=none; httponly
Transfer-Encoding: chunked
Vary: Accept-Encoding
X-Content-Type-Options: nosniff
X-Frame-Options: DENY
X-Xss-Protection: 1
0
Casper-SC
Эксперт .NET
4094 / 1944 / 381
Регистрация: 27.03.2010
Сообщений: 5,345
Записей в блоге: 1
19.01.2020, 15:56  [ТС] 2
Может быть нужны ещё какие-то данные? Неужели это мне так одному повезло и ни у кого не возникало такой проблемы?

Добавлено через 12 минут
Похоже, дело в том, что Cookies должны передаваться по HTTPS, чтобы они сохранились в браузере, так как эти самые Cookie помечены как secure. Вычитал здесь: https://www.php.net/setcookie (пункт secure). Правда там написано, что должны передаваться от клиента к серверу, но может из-за протокола HTTP браузер и не сохраняет их вообще. Проверяю теорию. Осталось понять, как отключить этот параметр у Cookie в ASP.NET Core 2.2.
0
yurickas
145 / 123 / 30
Регистрация: 25.11.2015
Сообщений: 856
Завершенные тесты: 2
19.01.2020, 16:00 3
ну, чисто теоретически nginx может.

чтобы отсечь он или не он, постучись запросом прямо в приложение мимо nginx. Если для этого надо порт пробросить, то не я тебя буду этому учить )))

И кагбэ, если делаешь SPA на js-фреймворке, то авторизацию лучше не делать через куки. Есть JWT, к примеру.
0
Casper-SC
Эксперт .NET
4094 / 1944 / 381
Регистрация: 27.03.2010
Сообщений: 5,345
Записей в блоге: 1
19.01.2020, 16:01  [ТС] 4
Цитата Сообщение от yurickas Посмотреть сообщение
И кагбэ, если делаешь SPA на js-фреймворке, то авторизацию лучше не делать через куки. Есть JWT, к примеру.
Я и сделал JWT, но потом вычитал статью, что хранить токен в локальном хранилище - это плохо и нужно сохранять как куки.
0
yurickas
145 / 123 / 30
Регистрация: 25.11.2015
Сообщений: 856
Завершенные тесты: 2
19.01.2020, 16:05 5
Цитата Сообщение от Casper-SC Посмотреть сообщение
Похоже, дело в том, что Cookies должны передаваться по HTTPS, чтобы они сохранились в браузере, так как эти самые Cookie помечены как secure. Вычитал здесь: https://www.php.net/setcookie (пункт secure). Правда там написано, что должны передаваться от клиента к серверу, но может из-за протокола HTTP браузер и не сохраняет их вообще. Проверяю теорию. Осталось понять, как отключить этот параметр у Cookie в ASP.NET Core 2.2.

вопрос может уйти, если поставить ssl-сертификат в nginx. Можно поставить бесплатный.

https://codex.so/ssl

Добавлено через 1 минуту
Цитата Сообщение от Casper-SC Посмотреть сообщение
Я и сделал JWT, но потом вычитал статью, что хранить токен в локальном хранилище - это плохо и нужно сохранять как куки.
Кто такую глупость сказал? Нормально токен хранится в локалсторе. Если не хочется в локалсторе - есть session store.
1
Casper-SC
Эксперт .NET
4094 / 1944 / 381
Регистрация: 27.03.2010
Сообщений: 5,345
Записей в блоге: 1
19.01.2020, 17:00  [ТС] 6
Нашёл статью, в которой многое объясняется, в том числе про secure флаг в куках и где что настраивается: Хабр: Безопасный способ обмена JWT в ASP.NET Core + SPA.

Добавлено через 1 минуту
Цитата Сообщение от yurickas Посмотреть сообщение
вопрос может уйти, если поставить ssl-сертификат в nginx. Можно поставить бесплатный.
У меня есть бесплатный, достался при регистрации доменного имени (пока регаю всё на себя и на своём VPS). Это всё заказчик меня замутил своими -давай развернём быстрее, пока шифрование не нужно (я это впервые всё делаю, опыта нет в развёртывании). Сто раз убедился, что нельзя никого слушать, а нужно делать как знаешь, только проблем себе создал.

Добавлено через 1 минуту
Цитата Сообщение от yurickas Посмотреть сообщение
Кто такую глупость сказал? Нормально токен хранится в локалсторе. Если не хочется в локалсторе - есть session store.
Хабр: Почему не стоит использовать LocalStorage

Добавлено через 2 минуты
Цитата Сообщение от yurickas Посмотреть сообщение
чтобы отсечь он или не он, постучись запросом прямо в приложение мимо nginx. Если для этого надо порт пробросить, то не я тебя буду этому учить )))
Это всё понятно, но у меня закрыты все другие порты с помощью iptables в Ubuntu (и с ним я намучался) и приложение вообще поднятно на localhost в Ubuntu. Да это всё можно настроить, но так неохота . В общем, попоробую настроить шифрование после проверки, что убрав флаг всё заработает.

Добавлено через 28 минут
Ну наконец-то всё заработало! Это временное решение, потом настрою HTTPS.

C#
1
2
3
4
5
6
7
            app.UseCookiePolicy(new CookiePolicyOptions
            {
                MinimumSameSitePolicy = SameSiteMode.Strict,
                HttpOnly = HttpOnlyPolicy.Always,
                // При включении HTTPS нужно вернуть CookieSecurePolicy.Always
                Secure = CookieSecurePolicy.None,
            });
C#
1
2
3
4
5
            app.UseSecureJwt();
            app.UseAuthentication();
            // Не забыть вернуть в app.UseCookiePolicy параметр Secure = CookieSecurePolicy.Always,
            //app.UseHttpsRedirection();
            app.UseMvc();
0
yurickas
145 / 123 / 30
Регистрация: 25.11.2015
Сообщений: 856
Завершенные тесты: 2
19.01.2020, 18:39 7
Цитата Сообщение от Casper-SC Посмотреть сообщение
Хабр: Почему не стоит использовать LocalStorage
Почитал. Долго думал. И никак не могу понять, или я дурак, или аффтар сего опуса идиот. Ни одного конкретного примера как можно слить токен из локалстора, кроме инжекта скрипта. Только там аффтар кабы не в курсе наверное, что под ssl подменить сторонний скрипт не получится. Без ssl можно, но только на стороне провайдера или хакнутого роутера. Есть такое явление со стороны провайдеров, как подмена скрипта. В консоли при работе без ssl можно увидеть иногда как бутстрап или jquery делают запросы на левые сайты. Была статья на Хабре как чувак так Tele2 спалил. Установка ssl решает эту проблему.
И тогда почему аффтар не написал про слив кук и межсайтовую атаку через них?
https://ru.wikipedia.org/wiki/%D0%9C...BE%D1%81%D0%B0

А про:

HTML5
1
<script src="https://awesomejslibrary.com/minified.js"></script>
я вообще не понял. Тот же ангуляр выкашивает из разметки любые другие левые скрипты.

И далее, если ставить вопрос окончательно, то что мешает контролировать токен? Со стороны сервера нет сложности в том, чтобы идентифицировать откуда прилетел токен и как его заблокировать.
1
19.01.2020, 18:39
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.