HTTP-запросы CORS с учетными данными не выполняются с помощью Axios - PullRequest
0 голосов
/ 14 сентября 2018

У меня есть устаревший веб-сайт asp.net и новый основной сайт asp.net, использующий cookie-файл авторизации.Когда я пытаюсь сделать HTTP-запрос CORS от Typescript (на основном сайте) к методу веб-службы (на устаревшем сайте), используя Axios, он завершается с ошибкой , если я не передаю пустой объект данных.Например:

Этот запрос будет терпеть неудачу :

    const url: string = "http://legacy.mydev.machine:1259/MyService.asmx/GetInformation";
    const optionsThatWontWork: AxiosRequestConfig = {
        withCredentials: true
    };
    axios.get(url, optionsThatWontWork)
        .then((response) => { console.log(response); })
        .catch((error) => { console.log(error); });

Браузер выполняет 1 запрос HTTP GET (без предварительной проверки), который возвращает HTTP 500 со следующимсообщение в ответе

"Формат запроса не распознан для URL, неожиданно заканчивающегося на '/GetInformation'."

Но этот работает :

    const url: string = "http://legacy.mydev.machine:1259/MyService.asmx/GetInformation";
    const optionsThatWillWork: AxiosRequestConfig = {
        withCredentials: true,
        data: {
            // Adding this empty data object makes a difference
        }
    };
    axios.get(url, optionsThatWillWork)
        .then((response) => { console.log(response); })
        .catch((error) => { console.log(error); });

В этом случае браузер делает 2 запроса.Первый - это запрос HTTP OPTIONS, который возвращает 200, затем второй - GET, который успешно достигает конечной точки GetInformation и возвращает 200 с данными json.

При сравнении двух сообщений HTTP GET единственноеРазница, которую я вижу, состоит в том, что успешный имеет заголовок Content-Type: application/json;charset=utf-8.

Я попытался добавить этот заголовок вручную, но это тоже не сработало:

    const optionsThatStillWontWork: AxiosRequestConfig = {
        withCredentials: true,
        headers: {
            "Content-Type": "application/json;charset=utf-8"
        },
    };

Я настроилCORS в конвейере Owin старого сайта с использованием Microsoft.Owin.Cors:

Private Sub ConfigureCors(ByVal app As IAppBuilder)
    Dim corsPolicy = New CorsPolicy() With {
        .AllowAnyMethod = True,
        .AllowAnyHeader = True,
        .SupportsCredentials = True,
        .AllowAnyOrigin = False
    }

    corsPolicy.Origins.Add("http://newsite.mydev.machine:9050")

    Dim corsPolicyProvider = New CorsPolicyProvider With {
        .PolicyResolver = Function(context) Task.FromResult(corsPolicy)
    }

    Dim options = New CorsOptions With {
        .PolicyProvider = corsPolicyProvider
    }

    app.UseCors(options)
End Sub

Примечание: и http://legacy.mydev.machine:1259, и http://newsite.mydev.machine:1259 имеют записи в моем файле hosts, указывающие на 127.0.0.1.

Согласно документации axios опция конфигурации data равна

"Применимо только для методов запроса PUT, POST иPATCH '"

... с чем я бы согласился.

Тогда пара вопросов:

  1. Почему происходит добавление пустого объекта dataзаставить это работать?
  2. Почему первый пример не выполняет предполёт?
  3. Мой CНастройки ORS на старом сайте выглядят нормально?

1 Ответ

0 голосов
/ 16 сентября 2018

Кажется, проблема в коде на стороне сервера.

  1. Возможно, это связано с тем, что Content-Type добавляется автоматически, поскольку предоставляется data. Даже для запроса GET, который не отправляет полезную нагрузку.
  2. Предварительная проверка не отправляется на «простой» запрос . GET-запрос без каких-либо заголовков за пределами whilelist не требует отправки предварительной проверки.
  3. основная причина не связана с CORS (поскольку она возвращает 200 OK в «специальном» потоке и поскольку она вообще не затрагивается в «нормальном» потоке)

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

Кстати, если предварительная проверка CORS не удалась, не будет 500 Внутренняя ошибка сервера для запроса GET. Предварительная проверка OPTIONS не будет выполнена, и при следующем шаге не будет запроса GET.

...