Продолжайте получать Unauthorize Web API - PullRequest
0 голосов
/ 15 октября 2019

У меня есть проект. Это веб-приложение, требующее аутентификации Windows.

Я установил Active Directory дома, используя виртуализацию NAS. Затем я создал сервер VMWare для IIS, который является членом этого домена на моем рабочем столе, который я также использую для разработки. Я создал Web API и установил его на этот сервер VMWare. Когда я вызываю подпрограмму напрямую, она работает и возвращает результаты, но когда я использую подпрограмму Web API из моего веб-приложения javascript, я продолжаю получать ошибку 401. Затем я помещаю код на сервер IIS, и веб-приложение работает.

Я видел множество решений, таких как изменение последовательности провайдера в аутентификации IIS. Добавлено Все права на чтение / запись для папок. Я также добавил запись в web.config. Но ни один из них не работает.

***** Обновление в соответствии с запросом на комментарий *****

Ниже приведен пример, когда я запускаю напрямую из Web API

enter image description here

Вызов веб-API из Javascript enter image description here

enter image description here

Вот ошибка, которую я получаю enter image description here enter image description here

Просто к вашему сведению, я пытался запустить веб-API из Visual Studio на той же машине, но ис ошибкой 401

enter image description here

Можно ли добавить что-либо в AD, чтобы сделать мою машину разработки надежной?

******************** Новая проблема после изменения кода ********** enter image description here

**************** Другое обновление ****** Это определенно странно, поэтому я установил Fiddler 4, чтобы посмотреть, что происходит. Но все равно не повезло.

Затем я внес изменения в заголовок ответа IIS HTTP

enter image description here

enter image description here

Странно то, что когда я запускаю Fiddler, ошибка исчезает, но когда я закрываю ее, она возвращается.

1 Ответ

0 голосов
/ 16 октября 2019

Здесь происходит две вещи:

  1. Ответ 401 является обычным первым шагом к аутентификации Windows. Ожидается, что клиент затем повторно отправит запрос с учетными данными. AJAX-запросы не будут делать это автоматически, если вы не сообщите об этом.

Чтобы сообщить ему об отправке учетных данных в междоменном запросе (подробнее об этом позже), вам нужно установить withCredentials опция, когда вы делаете запрос в JavaScript.

С jQuery это выглядит так:

$.ajax({
   url: url,
   xhrFields: {
      withCredentials: true
   }
}).then(callback);
Эти проблемы возникают, когда URL-адрес в адресной строке браузера отличается от URL-адреса API, к которому вы пытаетесь подключиться в JavaScript. Браузеры очень разборчивы, когда это разрешено. Это так называемые «междоменные запросы» или «Междисциплинарный общий доступ к ресурсам» (CORS).

Он просматривает протокол, имя домена и порт. Таким образом, если веб-сайт http://localhost:8000 и отправляет запрос AJAX на http://localhost:8001, это все еще считается междоменным запросом.

Когда междоменный запрос AJAX сделан, браузер сначала отправляетзапрос OPTIONS к URL-адресу, который содержит URL-адрес веб-сайта, который делает запрос (например, http://localhost:8000). Ожидается, что API вернет ответ с заголовком Access-Control-Allow-Origin, в котором указано, разрешено ли веб-сайту, выполняющему запрос.

Если вы не планируете отправлять учетные данные, тогда заголовок Access-Control-Allow-Origin может быть *, что означает, что API позволяет кому-либо вызывать его.

Однако, если вам нужно отправить учетные данные, как вы, вы не можете использовать *. Заголовок Access-Control-Allow-Origin должен содержать домен (и порт) вашей веб-страницы, а для Access-Control-Allow-Credentials должно быть установлено значение true. Например:

Access-Control-Allow-Origin: http://localhost:8000
Access-Control-Allow-Credentials: true

Это немного болезненно, да. Но это необходимо для безопасности.

Подробнее о CORS можно прочитать здесь: Обмен ресурсами между источниками (CORS)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...