#amazon-web-services #asp.net-web-api #amazon-ec2 #amazon-cloudfront
#amazon-веб-сервисы #asp.net-web-api #amazon-ec2 #amazon-cloudfront
Вопрос:
Я использую AWS EC2 последние пару лет. Теперь я хочу включить HTTPS в своем приложении, разработанном на ASP. NET WEB API с интерфейсом в AngularJS. Для этого я создал дистрибутив CloudFront. Он успешно загрузил статические файлы и вызвал REST API на EC2, размещенном в IIS. Но, к сожалению, пользовательские заголовки имеют null в качестве значения, когда запросы поступают из CloudFront в мой origin.
Я выполнил следующие соответствующие конфигурации в дистрибутиве CloudFront.
Ниже приведены мои настройки для пользовательских исходных заголовков.
Ниже приведены мои настройки поведения кэша.
Дальнейшая настройка включала следующее:
- Файлы cookie из белого списка: авторизация, VDName
- Перенаправление и кэширование строки запроса: пересылка всех, кэширование на основе всех
- Политика протокола Origin: только HTTP
- Политика протокола просмотра: перенаправлять HTTP на HTTPS
В моем приложении есть страница входа, на которой не требуется авторизация. При успешном входе в систему приложение устанавливает три пользовательских заголовка.
- Авторизация
- x-working-компания
- x-working-branch
Мое приложение успешно регистрирует пользователей, но затем автоматически выводит их из системы. Итак, чтобы проверить эту проблему, я написал следующий небольшой код в своем классе авторизации для проверки значений заголовка.
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 пересылает заголовки в мой источник, но с нулевыми значениями. Результаты следующие:
Ниже приведен режим разработчика FireFox, в котором мой интерфейс отправляет запрос в CloudFront со всеми пользовательскими заголовками с соответствующими значениями. Но затем CloudFront перенаправляет эти заголовки в origin, но делает значения нулевыми.
Итак, что я делаю не так? Почему CloudFront передает null в качестве значения в моих заголовках. Любая помощь высоко ценится. Большое спасибо!
Редактировать
Я попытался подключиться к API с помощью Postman, и ниже приведены скриншоты.
Ниже показан мой вызов метода Login и, как и ожидалось, он возвращает токен аутентификации с другими пользовательскими заголовками, установленными в ответе.
Я извлек необходимые заголовки из ответа и отправил другой запрос GET и получил следующее.
Выдает ошибку 403 forbidden. Странно, что в режиме разработки браузера он выдает 401 несанкционированную ошибку, а в Postman это 403 запрещено.
Любая помощь. Спасибо
Ответ №1:
При настройке пользовательских заголовков Origin CloudFront будет включать их в каждый запрос к вашему origin, и если заголовок уже предоставлен, он переопределяется. Это не то, что вы хотите, и это объясняет, почему вы видите нулевые значения (вы добавили свои заголовки без значений).
Пользовательские заголовки Origin следует использовать только для постоянных значений или когда вам явно нужно переопределить заголовок.
В вашем случае вам необходимо внести заголовки в белый список в настройках поведения кеша, введя x-working-branch
и x-working-company
в разделе «Заголовки белого списка» и нажав Добавить пользовательские >>, как показано здесь. как показано здесь. >>:
(Я сохранил ваши заголовки авторизации и хоста)
Пожалуйста, обратите внимание, что пересылка заголовков влияет на кэширование: отдельные версии создаются на основе значений заголовка. Смотрите также Кэширование содержимого на основе заголовков запросов. Это означает, что разные комбинации Authorization
, Host
, x-working-branch
и x-working-company
приведут к разным версиям (очевидно, это то, что вы хотите здесь, чтобы избежать предоставления одного и того же контента разным пользователям). Это также справедливо для строк запроса и файлов cookie.
Действительно важно понимать, как CloudFront кэширует объекты. Наиболее важной частью документации является управление тем, как долго содержимое остается в пограничном кэше (истечение срока действия)
Комментарии:
1. спасибо за ответ. Я добавил все 4 заголовка, как вы предложили, в белый список, а в пользовательском заголовке Origin есть только Content_type:application / json. Я аннулировал свой дистрибутив, чтобы очистить кеш. Более того, я отправляю заголовок без кэша, чтобы пока ничего не кэшировать. Но возникает та же ошибка. Есть ли зацепки?
2. Каков статус вашего дистрибутива CloudFront после внесения изменений? Развернуты или все еще находятся в процессе ? Когда вы увидите, что развернуто , убедитесь, что еще раз сделали недействительным.
3. ОК. позвольте мне повторить. Я делаю недействительным ввод / * в пути к объекту. правильный ли это способ очистить весь кеш?
4. Да, и убедитесь, что ваши изменения были применены, посмотрев на столбец Статуса в консоли, где вы видите все свои дистрибутивы (вы должны увидеть, что они там развернуты ).
5. Нет. я думаю, что есть проблема с поведением кэширования. Итак, я подумал подождать 24 часа, чтобы кэш мог очиститься, а затем я снова нажму. В противном случае я поцарапал голову над этим и прошел целых 2 дня, но ничего не помогло. Спасибо за вашу заботу. Я обновлю вас после попадания