Рендеринг и подача HTML файла с CSS / JS с диска сервера в клиентский браузер - PullRequest
0 голосов
/ 08 апреля 2020

Я застрял с проблемой, которая простыми словами заключается в поиске способа безопасной визуализации и обслуживания HTML файлов (вместе с CSS, JS) с локального диска на сервере для веб-приложение, запущенное в клиентском браузере.

ПРИЛОЖЕНИЯ

  1. Интерфейсное веб-приложение создается с использованием React JS (response-admin to точнее).
  2. Внутренняя часть, обрабатывающая запросы API Rest, настраивается с использованием Net core 3.1
  3. Оба приложения размещаются в IIS на сервере Windows (как служба приложений внутри веб-сайт по умолчанию в IIS).

ОГРАНИЧЕНИЯ

  1. Размещение приложений должно осуществляться только внутри IIS на сервере windows. (Другие варианты также приветствуются)
  2. Back / Front end может быть на любом языке, как мы желаем. (желательно точка net ядро, поскольку я использую c# в течение последних 10 лет)

ТЕХНИЧЕСКИЕ ДАННЫЕ

Я работаю над разработкой решение для просмотра облаков точек (Potree, проект с открытым исходным кодом, разработанный с использованием трех- js). Это самостоятельный процесс. Конвертер C ++ для настольных ПК предоставляет Potree, который преобразует входные данные в веб-страницу (с html, css, js) ( ДАВАЕТ ВЫЗВАТЬ ЭТО ФАЙЛЫ-ЦЕЛИ ) Мы можем разместить эту веб-страницу на любом сервере для просмотра сторонними организациями.

ТЕКУЩИЙ СТАТУС

  1. Работает: Целевые файлы размещаются на сервере IIS как приложение, и к ним можно получить доступ без проблем. (изображение можно увидеть ниже).

  2. Работает: Веб-приложение реагирует js, файлы dist размещаются на сервере IIS, и к нему также можно обращаться без проблем.

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

enter image description here

ХАРАКТЕРИСТИКА, С КОТОРОЙ Я УСТУПАЮ

  1. Целевые файлы предназначены для разных пользователей. Таким образом, это должно быть выполнено после проверки через запрос API.
  2. Текущая настройка такова, что когда пользователь щелкает ссылку в приложении реагирования, он выполняет вызов REST Api, который обрабатывается серверной частью do * Базовое приложение 1126 * (могут быть и другие более эффективные способы передачи файлов html во внешнее веб-приложение).
  3. Я пробовал несколько способов обработать файл HTML. Вариант 1: использовать StaticFiles (при запуске). Я пытаюсь прочитать файл html из локального файла и затем отобразить его внутри файла noidea.cs html, используя @Html.Raw(Model.SomePropertyName)

        // GET: /<controller>/
    public IActionResult noidea()
    {
        try
        {
            var newmodel = new noideaModel();
            var file = System.IO.File.ReadAllLines("./acl-i/acl-i.html");
            newmodel._html = string.Join("", file);
            return View(newmodel);
    
            //return View();
        }
        catch (Exception)
        {
            throw;
        }
    }
    

    }

Этот параметр работает частично нормально, но проблема в том, что, поскольку я поместил файлы в папку stati c (настроенную при запуске), пользователи могут легко изменить URL-адрес и получить доступ к другим файлам, присутствующим там.

enter image description here

Итак, я попытался сделать с опцией 2, которая заключается в том, чтобы просто прочитать содержимое файла html с локального диска и использовать его как результат содержимого .:

        [AllowAnonymous]
    [HttpGet, Route("viewer")]
    public IActionResult getViewer()
    {
        //For serving single static html file.
        var file = System.IO.File.ReadAllLines("./acl-i/acl-i.html");
        var item = string.Join("", file);

        return new ContentResult
        {
            ContentType = "text/html",
            StatusCode = (int)StatusCodes.Status200OK,
            Content = item
        };
    }

Точка успеха здесь заключается в том, что я могу правильно пройти аутентификацию, и пользователи не могут изменить URL-адрес, поскольку конечная точка API обслуживает файл. Проблема в том, что я просто обслуживаю только HTMl, а связанные css, js не распознаются браузером клиента. Ниже изображение показывает проблему. js и CSS также ищутся в одной конечной точке API.

enter image description here

ВОПРОС:

Я новичок в реагировании js и на разработку веб-интерфейса. В основном я работаю с Xamarin, C # / WPF / XML для настольных приложений и разрабатываю конечные точки Web API для приложений CRUD. Итак, я полностью застрял здесь. Не знаю, как решить проблему.

  1. Я ищу решение текущей проблемы.
  2. Или найти элегантный простой способ чтобы решить проблему (я также видел пример express js с реакцией js, но это было неясно, и я тоже новичок в этом).

Мне просто нужно найти способ аутентификации пользователя, а затем предоставить ему полностью визуализированную html страницу для просмотра в его браузере ( это так легко объяснить таким образом ) Любая помощь или направление / предложение приветствуется.

1 Ответ

0 голосов
/ 11 апреля 2020

Я пробовал разные методы, чтобы решить эту проблему. Наконец-то я пришел к решению. (Может быть, это не самый лучший, но может быть полезным для кого-то, кто также имеет аналогичные проблемы).

РАБОЧИЙ ПОТОК: Теперь мы получаем несколько встроенных веб-страниц от наших внешних субподрядчиков каждую неделю. Наши субподрядчики используют Potree Converter для преобразования своих данных облака точек в веб-страницы (которые имеют несколько html, js, css), упакованные в файлы размером около 2-3 ГБ (из-за размера данных облака точек) , Невозможно загрузить все файлы с одного go в браузер клиента. Это обрабатывается самой веб-страницей potree. На основе просмотра пользователей страница html извлекает часть данных и часто отправляет. Тем не менее, нам не нужно беспокоиться об этом, поскольку он полностью управляется командой разработчиков Potree (благодаря Институту компьютерной графики и алгоритмов, TU Wien)

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

ПРИЛОЖЕНИЯ: Изначально я разработал два приложения, а также преобразовал страницу html из конвертера Potree.

  1. React JS веб-приложение: для работы в качестве внешнего интерфейса ( Давайте назовем приложение 1 )
  2. Dot net core 3.1 backend: для обработки запросов API. ( Давайте назовем приложение 2 )

Этот проект размещен в IIS. Итак, я создал новый сайт (работающий на другом порту за брандмауэром и не доступный для внешних сторон). Давайте назовем это Target Site

Настройка обратного прокси через IIS

  1. Мы настроили обратный прокси в IIS (через ARR) для всех входящих запросов.
  2. IIS будет фильтровать входящий URL-адрес, который содержит определенную строку в URL-адресе. (Например, / 5506f977-7463-4f85-86ff-7ca63bac34fa / , скажем, url_guid ).
  3. URL Rewrite изменит это и направит на целевой сайт (работает на другом порту за брандмауэром)

** Настройка целевых файлов **

Каждый раз, когда мы получаем новые целевые страницы (преобразованные zip-файлы) от субподрядчиков, мы берем индекс. html файл, переименовываем его с помощью GUID (target_file_GUID), добавляем тег в заголовок, чтобы включить url_guid и поместите его в общий каталог.

Мы добавляем target_file_GUID в столбец нашей таблицы базы данных Mysql, в которой также есть столбец для хранения фактического имени файла.

Решение

  1. Из приложения 1 мы отправляем запросы в приложение 2 (с аутентификацией JWT в заголовках и требуемым файлом HTML (или модель облака точек)).
  2. После проверки мы извлекаем имя guid соответствующего файла html из MYSQL
  3. Этот конкретный файл затем выбирается из общего каталога и отправляется в браузер.
  4. На этом этапе URL-адрес браузера по-прежнему не изменяется и содержит тот же URL-адрес, который использовался для доступа к контроллеру API.
  5. Когда загружается файл Html, он также пытается загрузить требуемый JS, CSS файлы, упомянутые в html. Трюк здесь происходит. Поскольку мы указали тэг, новый URL-запрос отправляется на сервер, который перехватывается IIS и перезаписывается на внутренний сервер. (На данный момент URL-адрес в браузере клиента по-прежнему не изменяется из-за перезаписи сервера).
  6. Клиентский броузер получает файлы JS, CSS (но все же URL-адрес в браузере клиента а также заголовки запроса не отображают фактический URL).

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

Ключевые достижения здесь

  1. авторизация пользователей перед перенаправлением их на другой URL.
  2. URL Rewrite не показывает исходный URL для клиентского браузера
  3. Исходный целевой сайт по-прежнему защищен брандмауэром.
  4. . Исходное имя файла html заменяется на GUID (что трудно угадать для пользователя), и это html имя guid изменяется. неоднократно через windows приложение консоли службы каждую неделю. (Допустим, у нас всего 1000 файлов. Имена меняются каждую неделю, чтобы обеспечить их безопасность и уверенность).
  5. Пользователи не могут напрямую обращаться к файлу html (даже если он знает имя файла. это выполняется только через приложение 2 после аутентификации)

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

...