CORS PreFlight не отправляет учетные данные, сервер хочет отклонить неаутентифицированных пользователей

Сценарий

Веб-сервер IIS. Не веб-сервис .Net. Отправка в веб-сервис.

Веб-приложение .Net, подключающееся к веб-службе междоменным образом.

Требование

Веб-сервер должен требовать авторизованных пользователей Active Directory с единым входом в систему.

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

Где я нахожусь:

У меня есть успешный междоменный вызов CORS, работающий между веб-приложением и веб-сервером. Я ясно вижу, как работает вызов OPTIONS, а затем работает последующий вызов POST.

Проблема:

Вызов OPTIONS не отправляет учетные данные. Чтобы обойти это, мы разрешаем анонимных пользователей на уровне веб-сайта. В противном случае получаем ошибку 401 Unauthorized.

Однако, как только мы это сделаем, POST больше не требует аутентификации. Фактически, журнал веб-сервера показывает, что учетные данные вообще не отправляются в почте. Это неприемлемо.

Мне нужен способ либо (а) заставить вызов OPTIONS отправлять учетные данные Active Directory, либо (б) веб-сервер должен отклонять все неаутентифицированные запросы без OPTIONS.

Предпочтения:

Что касается пути решения (а), я вполне согласен с тем, что для этого требуется.

Для пути решения (b) предпочтительнее параметр IIS или параметр web.config. Веб-сервер написан на python, но я полагаю, что мы могли бы создать модуль кода веб-сервера C #, который будет вызывать код python, который выполняет реальную работу на сервере.

Идеи?


person david wendelken    schedule 23.08.2016    source источник


Ответы (2)


Ссылаясь на требования в вопросе:

Мне нужен способ либо (а) заставить вызов OPTIONS отправлять учетные данные Active Directory, либо (б) веб-сервер должен отклонять все неаутентифицированные запросы без OPTIONS.

Невозможно заставить браузеры отправлять учетные данные в вызове OPTIONS. Браузеры должны опускать учетные данные во всех OPTIONS предварительных запросах.

См. первый шаг алгоритма в разделе CORS-preflight fetch Спецификация Fetch, в которой говорится:

Чтобы выполнить предварительную выборку CORS с использованием запроса, выполните следующие действия:

  1. Пусть предварительная проверка будет новым request, метод которого равен OPTIONS, url – текущий URL-адрес запроса, инициатор – инициатор запроса, тип > — тип запроса, destination — назначение запроса, origin — источник запроса, referrer — реферер запроса и правила реферера является политикой реферера запроса.

Каждый request также содержит режим учетных данных:

С запросом связан режим учетных данных: omit, same-origin или include. Если не указано иное, это omit.

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

Учитывая это, вы не найдете никакого способа обойти это на стороне клиента (браузера), поэтому, я думаю, вам придется исправить это на стороне сервера.

person sideshowbarker    schedule 24.08.2016
comment
Спасибо. В некоторых статьях CORS, которые я читал, говорится, что учетные данные не отправляются по запросу параметров по умолчанию, что означает, что они могут быть отправлены. Есть ли способ настроить IIS так, чтобы он принимал только анонимные запросы опций, но запрашивал учетные данные для всего остального? Единственный найденный нами способ заставить параметры работать — просто остановить отправку учетных данных по почте. - person david wendelken; 24.08.2016
comment
Извините, я ничего не знаю о настройке IIS. Я ответил, чтобы просто дать понять, что нет никакого способа обойти это со стороны клиента. - person sideshowbarker; 24.08.2016
comment
Chrome отправляет учетные данные в предварительных запросах OPTIONS. - person heez; 14.03.2018

Это не тот ответ, который я просил, но это ответ, который может решить проблему для некоторых людей.

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

Для этого можно настроить групповые политики.

Computer Configuration 
-> Administrative Templates 
   -> Windows Components
      -> Internet Explorer
         -> Internet Control Panel
            -> Security Page
               -> Intranet Zone  (and/or Trusted Sites Zone, depending)
                  -> Access data sources across domains  
                        (set to Enabled.)

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

person david wendelken    schedule 24.08.2016