CloudFront пересылает пользовательские заголовки в источник, но с нулевыми значениями - PullRequest
0 голосов
/ 24 апреля 2019

Я пользуюсь AWS EC2 последние пару лет. Теперь я хочу включить HTTPS для моего приложения, разработанного в ASP. NET WEB API с интерфейсом в AngularJS. Для этого я сделал дистрибутив CloudFront. Он успешно загрузил статические файлы и вызвал API REST для EC2, размещенного в IIS. Но, к сожалению, пользовательские заголовки имеют значение null , когда запросы пришли из CloudFront к моему источнику.

Я выполнил следующие соответствующие настройки в дистрибутиве CloudFront.

Ниже приведены мои настройки для пользовательских заголовков источника. origin

Ниже приведены мои настройки поведения кэша. cache behav

Дополнительные настройки включали следующее:

  • Белый список файлов cookie: авторизация, VDName
  • Пересылка и кеширование строки запроса: пересылка всех, кеш на основе всех данных
  • Политика протокола происхождения: только HTTP
  • Политика протокола просмотра: перенаправить HTTP на HTTPS

Мое приложение имеет страницу входа, где Авторизация не требуется. При успешном входе в систему приложение устанавливает три пользовательских заголовка.

  1. Авторизация
  2. х-рабочая компания
  3. х-рабочая ветвь

Мое приложение успешно регистрируется в пользователях, но затем автоматически выходит из системы. Итак, чтобы проверить эту проблему, я написал следующий небольшой код в своем классе Authorization для проверки значений заголовка.

valToUpd.Add("S6", "CHK1");
valToUpd.Add("S7", "Before Null");
valToUpd.Add("S8", request.Headers.Count().ToString());
valToUpd.Add("S9", request.Headers.GetValues("Authorization").Single());
valToUpd.Add("S10", request.Headers.GetValues("x-working-company").Single());
valToUpd.Add("S11", request.Headers.GetValues("x-working-branch").Single());
var toUpdt = "";
if (request.Headers.Any(x => x.Key == "Authorization"))
    toUpdt = "A-";
if (request.Headers.Any(x => x.Key == "x-working-company"))
    toUpdt += "C-";
if (request.Headers.Any(x => x.Key == "x-working-branch"))
    toUpdt += "B-";
var ds = request.Headers.Where(x => x.Key == "x-working-branch").Select(c => c.Value);
toUpdt += " br val = ";
foreach (var item in ds)
{
    foreach (var i in item)
    {
        toUpdt += i + " - ";
    }
}
valToUpd.Add("S12", toUpdt);
usersHelperAdo.Update("Users", whereClause, valToUpd); // Its my DAL method to update values in Users table as per the where clause.

И, как и ожидалось, CloudFront пересылает заголовки к моему источнику, но с нулевыми значениями. Результаты следующие:

Database vals

Далее следует режим разработчика FireFox, где мой клиент отправляет запрос в CloudFront со всеми пользовательскими заголовками с соответствующими значениями. Но затем CloudFront пересылает эти заголовки в исходное положение, но делает значения пустыми.

FireFox developer mode

Итак, что я делаю не так? Почему CloudFront передают null в качестве значения в моих заголовках. Любая помощь высоко ценится. Большое спасибо!

EDIT

Я попытался поразить API с помощью Почтальона, и ниже приведены скриншоты.

Ниже показан мой вызов метода Login и, как и ожидалось, он возвращает токен Auth с другими пользовательскими заголовками, установленными в ответе.

Postman Login

Я извлек необходимые заголовки из ответа, отправил еще один запрос GET и получил следующее.

Postman GET call

Выдает 403 запрещенных ошибки. Странно, что в режиме разработки браузера он выдает 401 несанкционированную ошибку, а в Почтальоне - 403 Запрещено.

Любая помощь. Спасибо

1 Ответ

1 голос
/ 24 апреля 2019

Настройка Пользовательские заголовки источника будут включать CloudFront в каждый запрос к вашему источнику, и если заголовок уже предоставлен, он будет переопределен. Это не то, что вам нужно, и это объясняет, почему вы видите значения null (вы добавили свои заголовки без значений).

Исходные пользовательские заголовки следует использовать только для постоянных значений или когда вам явно необходимо переопределить заголовок.

В вашем случае необходимо внести белый список в заголовки в Настройки поведения кэша , введя x-working-branch и x-working-company в Заголовки белого списка и нажав Добавить Custom >> как показано здесь:

enter image description here

(я сохранил авторизацию и хост заголовки)

Обратите внимание, что заголовки пересылки влияют на кэширование : отдельные версии создаются на основе значений заголовка. См. Также Кэширование содержимого на основе заголовков запросов . Это означает, что разные комбинации Authorization, Host, x-working-branch и x-working-company приведут к разным версиям (это, очевидно, то, что вы хотите здесь, чтобы не предоставлять один и тот же контент разным пользователям). Это также верно для строк запроса и файлов cookie.

Очень важно понять, как CloudFront кэширует объекты. Наиболее важной частью документации является Управление продолжительностью содержимого в пограничном кэше (срок действия)

...