Почему мне отказывают в моем вызове переднего плана в мою серверную службу?

У меня есть приложение Angular 4, работающее на порту 8001 сервера IIS, которое должно получить доступ к двум внутренним API .NET, работающим на одном и том же сервере, одно на порту 89, а другое на порту 83.

К этому приложению обращаются два типа пользователей: некоторые из них находятся в той же сети, что и сервер приложений, а некоторые - через виртуальный IP-адрес, имеющий разрешение на доступ к порту 8001 этого сервера и только к этому порту.

Внешний интерфейс вызывает API-интерфейсы, использующие REST, с таким кодом:

this.http.post<boolean>(`http://<ServerHostname>:89/api/Controller/VerifyLogin`, body);

При тестировании с пользователями в одной сети вызов проходит и все работает как положено. При тестировании пользователей с доступом через виртуальный IP-адрес они могут получить доступ к внешнему приложению, внешний интерфейс отображается, но вызовы API не работают. Это может быть связано с тем, что запрос выполняется с использованием имени хоста сервера вместо localhost, но я не уверен в этом.

Я попытался изменить вызов API для использования localhost, например так:

this.http.post<boolean>(`http://localhost:89/api/Controller/VerifyLogin`, body);

но когда я тестирую его в той же сети, запрос API не завершается.

Это сообщение об ошибке, которое появляется на консоли Chrome: zone.js:2933 OPTIONS http://localhost:89/api/GravacaoDb/VerificarLogin net::ERR_CONNECTION_REFUSED

РЕДАКТИРОВАТЬ : Вот конфигурация CORS в моем файле Web.config в API:

<system.webServer>
    <httpProtocol>
      <customHeaders>
        <add name="Access-Control-Allow-Origin" value="*" />
        <add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, OPTIONS" />
        <add name="Access-Control-Allow-Headers" value="Origin, X-Requested-With, Content-Type, Accept" />
        <add name="Access-Control-Max-Age" value="86400" />
      </customHeaders>
    </httpProtocol>
    <handlers>
      <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
      <remove name="TRACEVerbHandler" />
      <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
    </handlers>
  </system.webServer>

В чем может быть проблема с тем, что я делаю? В чем может быть причина того, что запрос не разрешен?

Всего 1 ответ


Вы, похоже, не считаете, что код Angular запускается в браузере пользователя, а не на сервере, где он хранится. Итак, вызовы API, которые вы делаете, приходят из браузера пользователя. Если этот браузер находится за пределами вашей локальной сети, брандмауэры заблокируют доступ через любой другой порт, кроме 8001 (как вы сами сказали в вопросе).

Так что это не проблема CORS.

Вам необходимо настроить сетевой брандмауэр таким образом, чтобы пользователям с виртуальным IP-адресом был разрешен доступ к порту 89 вашего сервера или (если это невозможно) создать прокси-службу, которая прослушивает порт 8001 (или другой порт, разрешенный в брандмауэре). и перенаправляет запросы на порт 89.


Одна важная вещь для рассмотрения:

Если вы откроете доступ к своим API таким образом, то любой может назвать эти API непроверенными. Но это общая проблема. Разрешение доступа к API из кода JavaScript на стороне клиента означает, что любой пользователь вызывает эти API.


Есть идеи?

10000