Как ограничить доступ к веб-ресурсам из интернета, но выставить в интрасети - PullRequest
3 голосов
/ 11 июня 2019

У меня есть веб-сайт, написанный на ASP.NET WebForms, который обращается к веб-службам, написанным на ASP.NET WebAPI. В целях безопасности я закрыл порт 8079 (веб-службы), чтобы к веб-службам можно было обращаться только через веб-сайт, но чтобы было невозможно запрашивать веб-службы непосредственно из Интернета. Когда я запрашиваю страницу на веб-сайте через программу Fiddler, я вижу запрос на веб-сайт, но не вижу запроса с веб-сайта на веб-службы. Все работает хорошо Но теперь я создал еще один веб-сайт, написанный на AngularJS, и хочу, чтобы этот веб-сайт также имел доступ к моим закрытым веб-службам. Возможно ли это через AngularJS? Ниже приведен код запроса веб-сервисов через веб-сайт ASP.NET.

HttpResponseMessage response = 
client.GetAsync("http://localhost:8079/api/values/5").Result;
if (response.IsSuccessStatusCode)
{
    Task<string> data = response.Content.ReadAsStringAsync();
    result += data.Result;
}

В результате сайт ( AngularJS ) и веб-приложение ASP.Net MVC должны быть доступны в Интернете, а веб-службы ( ASP.NET WebAPI ) не должны быть доступно в интернете.

Ответы [ 3 ]

1 голос
/ 12 июня 2019

В настоящее время клиент обращается к веб-службам напрямую, но необходимо обеспечить доступ клиента к веб-серверу, а веб-сервер - к веб-службам

Даже если вы создадите другое приложение ASP.NET (своего рода «фасад»), которое обрабатывает запросы от клиента и вызывает веб-службы внутри, это само по себе не решит проблему:

  • Если фасад принимает запросы от любого клиента и просто отправляет их веб-службам, это ничем не отличается от предоставления веб-служб напрямую Интернету.

Как отметил @Andrei Dragotoniu, вы должны защищать свои услуги, принимая запросы только от авторизованных клиентов.

Как разрешить доступ к веб-сервисам

Распространенным способом защиты доступа к веб-службам является JSON Web Token (JWT) . Маркер содержит зашифрованные утверждения, которые объясняют личность (и, возможно, другие аспекты) клиента. Обычно это работает следующим образом:

  • Новый токен генерируется на сервере после успешной аутентификации клиента. Аутентификация может быть либо ручной (форма входа в систему), либо автоматической (например, с OAuth ).
  • Как только токен сгенерирован, он возвращается клиенту. Затем клиент начинает присоединять токен в виде заголовка HTTP к каждому запросу, который он отправляет веб-сервисам. По каждому запросу веб-сервисы проверяют прикрепленный токен.

Этот блог предоставляет дополнительную информацию и примеры использования JWT в C #.

API-шлюзы

Требование ограничения доступа к веб-сервисам во внутренней сети не является редкостью. Типичным решением здесь является API Gateway .

(из Википедии) Шлюз : сервер, который действует как интерфейс API, принимает запросы API, применяет политики регулирования и регулирования, передает запросы в серверную службу и затем передает ответ обратно запрашивающей стороне. Шлюз часто включает механизм преобразования для организации и изменения запросов и ответов на лету. Шлюз также может предоставлять такие функции, как сбор аналитических данных и обеспечение кэширования. Шлюз может предоставлять функции для поддержки аутентификации, авторизации, безопасности, аудита и соответствия нормативным требованиям.

Подробнее об API-шлюзах в этой статье . Один из самых популярных API-шлюзов - Kong .

0 голосов
/ 12 июня 2019

Даже если вы развернете веб-сервис в интрасети, вы не сможете использовать веб-сервис из клиентского браузера ( Angular или JS Applications ).

Одним из возможных решений может быть

  1. Развертывание веб-службы на веб-сервере интрасети.
  2. Создайте прокси-веб-сервис на пограничном сервере ( они оба имеют интранет и интернет-доступ ). Прокси-веб-сервис должен просто предоставлять необходимые методы, скрывая оригинальные веб-методы.
  3. Использование прокси-веб-службы из клиентских приложений.

В противном случае клиентские приложения никогда не смогут использовать веб-сервисы интрасети.

Дополнительно, если вы создаете веб-приложения на базе ASP.Net NodeJS, его можно развернуть на пограничных веб-серверах, которые могут общаться с веб-службами интрасети, а пользователи (, проживающие в Интернете ) не могут получить доступ к веб-службам. непосредственно.

UPDATE: Кроме того, на основании приведенного выше кода создается впечатление, что вы пытаетесь использовать веб-службу из управляемого кода .Net Runtime ( ASP.Net MVC ). Что ж, в этом случае AngularJS переключит действие вашего контроллера. Затем контроллер на пограничном сервере может общаться с любым веб-сервисом интрасети. AngularJS не нужно общаться с веб-службой. Это прямо сейчас.

0 голосов
/ 11 июня 2019

"Когда я запрашиваю страницу на веб-сайте через программу Fiddler, я вижу запрос на веб-сайт, но не вижу запроса с веб-сайта на веб-службы"

Это утверждение верно в очень ограниченном контексте, но реальность намного больше, чем это.

Запросы от веб-сайта к его собственному API можно легко увидеть с помощью инструментов браузера, например ... нажмите F12 в любом браузере и перейдите на вкладку Сеть, это то, что любой может сделать, чтобы увидеть, что такое веб-сайт (любой сайт).

Вам нужно как-то защитить свой API. Вы можете использовать что-то вроде OAuth2 или на уровне сервера. Например, вы можете заблокировать сервер, чтобы принимать соединения только с IP-адреса вашего сайта. Вы также можете сделать так, чтобы сервер, на котором работает API, был полностью заблокирован. Вы можете заблокировать API.

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

...