Почему мне отказывают в моем вызове переднего плана в мою серверную службу? - PullRequest
0 голосов
/ 16 января 2020

У меня есть приложение Angular 4, работающее на порту 8001 сервера IIS, которое должно получить доступ к двум внутренним интерфейсам. NET API, работающие на одном сервере, один на порту 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 Ответ

1 голос
/ 16 января 2020

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

Таким образом, это не проблема CORS.

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


Одна важная вещь, которую следует учитывать:

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

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