Поделиться через


Понимание и решение проблем кросс-доменного обмена ресурсами (CORS) с прокси сервером приложений Microsoft Entra

Cross-origin resource sharing (CORS) могут представлять проблемы для приложений и API, которые вы публикуете через прокси приложения Microsoft Entra. В этой статье рассматриваются проблемы и решения, связанные с CORS при использовании прокси-сервера приложения Microsoft Entra.

Совет

Асинхронный JavaScript и расширяемый язык разметки известно как AJAX. AJAX содержит акроним внутри акронима в том, что язык разметки eXtensible (XML) состоит из последнего X в AJAX. AJAX расшифровывается как асинхронный JavaScript и XML, а XML означает расширяемый язык разметки.

Безопасность браузера обычно запрещает веб-странице выполнять запросы к другому домену. Это ограничение называется политикой единого источникаи предотвращает чтение конфиденциальных данных с другого сайта вредоносным сайтом. Однако иногда может потребоваться разрешить другим сайтам вызывать веб-API. CORS — это стандарт W3C, который позволяет серверу ослабить политику одного и того же происхождения и разрешить некоторые кросс-доменные запросы, отклоняя остальные.

Общие сведения и определение проблем CORS

Два URL-адреса имеют одинаковый источник, если они имеют одинаковые схемы, узлы и порты (запрос на комментарии (RFC) 6454), например:

  • http://contoso.com/foo.html
  • http://contoso.com/bar.html

Эти URL-адреса имеют разные источники, отличные от предыдущих двух:

  • http://contoso.net — другой домен
  • http://contoso.com:9000/foo.html — другой порт
  • https://contoso.com/foo.html — другая схема
  • http://www.contoso.com/foo.html — другой поддомен

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

Проблемы CORS можно определить с помощью средств отладки браузера:

  1. Запустите браузер и перейдите к веб-приложению.
  2. Нажмите клавишу F12, чтобы открыть консоль отладки.
  3. Попробуйте воспроизвести транзакцию и просмотрите сообщение консоли. Нарушение CORS приводит к ошибке консоли о источнике.

На следующем снимке экрана при щелчке по кнопке Попробовать появилось сообщение об ошибке CORS, в котором указано, что https://corswebclient-contoso.msappproxy.net не найдено в заголовке Access-Control-Allow-Origin.

, проблема CORS,,

Проблемы CORS с прокси приложениями

В следующем примере показан типичный сценарий прокси приложения Microsoft Entra CORS. Внутренний сервер размещает контроллер веб-API CORSWebService и клиент CORSWebClient, который вызывает CORSWebService. Поступает асинхронный запрос JavaScript и XML (AJAX) от CORSWebClient к CORSWebService.

локальный запрос на один и тот же источник

Приложение CORSWebClient работает при его размещении в локальной среде, но при публикации через прокси приложения Microsoft Entra не загружается или возникает ошибка. Если вы опубликовали приложения CORSWebClient и CORSWebService отдельно в качестве разных приложений через прокси приложения, эти два приложения размещаются в разных доменах. Запрос AJAX от CORSWebClient к CORSWebService является запросом между источниками, и он завершается ошибкой.

CORS запрос прокси приложения

Решения проблем с CORS в контексте прокси-сервера для приложений

Вы можете устранить предыдущую проблему CORS одним из нескольких способов.

Вариант 1. Настройка личного домена

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

Вариант 2. Публикация родительского каталога

Опубликуйте родительский каталог обоих приложений. Это решение работает особенно хорошо, если на веб-сервере есть только два приложения. Вместо публикации каждого приложения отдельно можно опубликовать общий родительский каталог, который приводит к тому же источнику.

В примерах показаны страницы прокси приложения Microsoft Entra для приложения CORSWebClient. Если для внутреннего URL-адреса задано значение contoso.com/CORSWebClient, приложение не может выполнять успешные запросы к каталогу contoso.com/CORSWebService, так как они являются перекрестными.

опубликовать приложение отдельно

Вместо этого задайте внутренний URL-адрес для публикации родительского каталога, включающего каталоги CORSWebClient и CORSWebService:

Опубликовать родительский каталог

Полученные URL-адреса приложения эффективно устраняют проблему CORS:

  • https://corswebclient-contoso.msappproxy.net/CORSWebService
  • https://corswebclient-contoso.msappproxy.net/CORSWebClient

Вариант 3. Обновление заголовков HTTP

Чтобы сопоставить запрос источника, добавьте пользовательский заголовок HTTP-ответа в веб-службе. Веб-сайты, работающие в службах IIS, используют диспетчер IIS для изменения заголовка.

Добавление пользовательского заголовка ответа в диспетчере IIS

Изменения не требуют каких-либо изменений кода. Это можно проверить в трассировке Fiddler.

**Post the Header Addition**\
HTTP/1.1 200 OK\
Cache-Control: no-cache\
Pragma: no-cache\
Content-Type: text/plain; charset=utf-8\
Expires: -1\
Vary: Accept-Encoding\
Server: Microsoft-IIS/8.5 Microsoft-HTTPAPI/2.0\
**Access-Control-Allow-Origin: https://corswebclient-contoso.msappproxy.net**\
X-AspNet-Version: 4.0.30319\
X-Powered-By: ASP.NET\
Content-Length: 17

Вариант 4. Изменение приложения

Вы можете изменить приложение для поддержки CORS, добавив заголовок Access-Control-Allow-Origin с соответствующими значениями. Способ добавления заголовка зависит от языка кода приложения. Для изменения кода требуется больше всего усилий.

Вариант 5. Продление времени существования маркера доступа

Не удается устранить некоторые проблемы CORS. Например, приложение перенаправляется на login.microsoftonline.com для проверки подлинности, а срок действия маркера доступа истекает. Вызов CORS завершается ошибкой. Обходной путь для этого сценария — продлить время существования маркера доступа, чтобы предотвратить истечение срока его действия во время сеанса пользователя. Дополнительные сведения см. в разделе Настраиваемое время жизни токенов в идентификаторе Microsoft Entra.

Вариант 6. Сложное приложение

Для приложений, состоящих из нескольких отдельных веб-приложений, где используются предварительные запросы (OPTIONS), их можно опубликовать с помощью функции комплексного приложения. Дополнительные сведения см. в статье Общие сведения о сложных приложениях в прокси-сервере приложений Microsoft Entra.

См. также