Запрос CORS Preflight не работает с Azure API Management

У меня есть 2 веб-сайта Azure (ASP.NET MVC 5 и ASP.NET WebApi 2). На веб-сайте MVC есть jQuery, который пытается отправить запрос CORS в WebApi. Он отлично работает, если подключается напрямую к WebApi. Однако это не работает при попытке подключения через Управление API.

Ошибка, которую я получил в Chrome:

XMLHttpRequest не может загрузить https://XXXXXX.azure-api.net/api/search. Ответ на предполетный запрос не проходит проверку контроля доступа: на запрошенном ресурсе отсутствует заголовок Access-Control-Allow-Origin. Поэтому доступ Origin 'https://YYYYYY.azurewebsites.net' запрещен.

Я исключил проблему с конфигурацией WebApi, потому что, как я уже сказал, она работает напрямую.

Ниже моя политика:

<policies>
    <inbound>
        <cors>
            <allowed-origins>
                <origin>*</origin>
                <!-- allow any -->
            </allowed-origins>
            <allowed-headers>
                <header>accept</header>
                <header>accept-encoding</header>
                <header>access-control-request-headers</header>
                <header>access-control-request-method</header>
                <header>connection</header>
                <header>content-type</header>
                <header>host</header>
                <header>origin</header>
                <header>referer</header>
                <header>user-agent</header>
            </allowed-headers>
            <expose-headers>
                <header>access-control-allow-headers</header>
                <header>access-control-allow-origin</header>
                <header>cache-control</header>
                <header>content-length</header>
                <header>date</header>
                <header>expires</header>
                <header>pragma</header>
                <header>server</header>
                <header>set-cookie</header>
                <header>x-aspnet-version</header>
                <header>x-powered-by</header>
            </expose-headers>
        </cors>
    </inbound>
    <backend>
        <base />
    </backend>
    <outbound>
        <base />
    </outbound>
</policies>

Любые идеи?


person Adam Szabo    schedule 15.11.2015    source источник
comment
Опечатка в ваших заголовках allowed-headers / access-control-request-headersn. У некоторых людей возникали проблемы с получением CORS, работающего с ошибочными заголовками stackoverflow.com/questions/26121824/ Это просто опечатка в вопросе SO или в вашей исходной политике?   -  person Darrel Miller    schedule 16.11.2015
comment
Ура, я исправил тип в политике, но ничего не изменил. :(   -  person Adam Szabo    schedule 16.11.2015
comment
Вы также добавляете заголовок авторизации? Я получаю эту ошибку, используя приложения api с COR.   -  person ozkary    schedule 05.01.2016
comment
Удачи с этим? В настоящее время я сам занимаюсь этой проблемой и не нашел много полезного в Интернете.   -  person Steve Eggering    schedule 20.04.2020
comment
То же самое. Я боролся уже неделю и пробую все, что могу найти в Интернете. Теперь я полностью понимаю, для чего нужен CORS, и по-прежнему получаю ошибку «Нет заголовка« Access-Control-Allow-Origin »присутствует» в моем приложении angular localhost. Очень неприятно.   -  person RocketsLee    schedule 06.05.2020
comment
@ Даррел Миллер: Какая опечатка?   -  person steve    schedule 12.01.2021
comment
@steve В исходном вопросе было access-control-request-headersn. Это было исправлено в вопросе   -  person Darrel Miller    schedule 13.01.2021


Ответы (1)


Политика CORS предназначена для случаев, когда серверная часть не поддерживает CORS. В этом случае вы можете ввести эту политику, и она будет отвечать на запросы OPTION, не перенаправляя их на ваш сервер. И вы можете использовать эту политику, чтобы решить, какие источники / заголовки / методы обрабатывать для CORS.

В качестве альтернативы, если ваш бэкэнд уже поддерживает CORS, и вы не видите преимуществ в обработке потока CORS на уровне APIM, вы можете просто проксировать весь поток. Для этого вам следует удалить политику CORS и создать новую операцию в своем API в APIM с методом OPTIONS, чтобы запросы OPTIONS перенаправлялись в бэкэнд в обычном режиме.

person Vitaliy Kurokhtin    schedule 22.01.2016
comment
Действительно??? CORS с APIM так сбивает с толку. Есть ли где-нибудь объяснение, как это сделать? Я искал какое-то время, но не нашел инструкций, которые имели бы для меня смысл. Я чувствую себя глупо. - person steve; 12.01.2021
comment
CORS в целом не совсем четкая спецификация. Лучшее место для начала, которое я могу предложить, - это MDN: developer.mozilla. org / en-US / docs / Web / HTTP / CORS. После этой статьи должно быть более ясно, почему политика cors была добавлена ​​в APIM и какие проблемы она решает. - person Vitaliy Kurokhtin; 13.01.2021
comment
Извините, я имел в виду настройку APIM для пересылки запросов CORS на бэкэнд. Я получаю CORS в целом, но я борюсь с настройкой CORS в APIM. И я понимаю, как APIM может обрабатывать согласование CORS через настройку политики, но не как он это делает, перенаправляя на бэкэнд. В этом ответе рассказывается, как это сделать в общих чертах, но недостаточно подробностей, чтобы я мог следовать. - person steve; 14.01.2021