Общедоступный URL-адрес является проблемой безопасности в развертывании ClickOnce. Тем не менее, есть решение вашей проблемы, если на вашем веб-сервере установлены Windows и .NET. Скажите, есть ли у вас? Мне придется придумать другой обходной путь для веб-сервера Linux на тот случай, если он у вас есть.
Brief
Во-первых, немного информации о развертывании ClickOnce. При развертывании приложения выполняются запросы GET на сервере (при условии, что WebDir - это каталог публикации на сервере)
G-1. GET /WebDir/setup.exe
(начальная загрузка)
G-2. GET /WebDir/MyApp.Application
(setup.exe -url request)
G-3. GET /WebDir/MyApp.Application
(URL-запрос поставщика развертывания приложения.)
G-4. GET /WebDir/Application Files/MyApp_1_0_0_0/MyApp.exe.manifest
(запрос манифеста приложения)
G-5. GET /WebDir/Application Files/MyApp_1_0_0_0/MyApp.exe.deploy
и другие файлы .deploy ... (запросы файлов приложений)
Осуществление
Теперь решение состоит в том, чтобы перехватывать эти запросы файлов на сервере. В IIS вы можете присоединить пользовательский HTTPHandler и обработать запрос. В Apache вы можете перенаправлять запросы в код PHP с помощью файлов .htaccess. Кроме того, вам нужно будет сгенерировать уникальный идентификатор uid
для клиентских экземпляров, загруженных с сервера (может быть вашим лицензионным ключом), и указать его в параметрах запроса URL-адреса поставщика развертывания.
Структура каталогов
Создайте папку "Application"
внутри вашего WebDir
и ограничьте доступ к /WebDir/Application/
. Остальное все может быть внутри /WebDir/
Запрос файлов
Итак, вот что вы делаете на веб-сервере Apache, размещенном на компьютере с Windows:
- Создайте пользовательскую страницу загрузки или используйте страницу, созданную при публикации приложения с помощью Visual Studio (но вам придется редактировать ее вручную!). Давайте предположим, что страница
/WebDir/Download.php
- После аутентификации пользователя с
Download.php
вы должны отправить setup.exe
из своего кода (можно сделать с помощью readfile()
в PHP) пользователю. Тем не менее, улов загрузки (setup.exe
) после установки сделает запрос GET [G-2]. Не забудьте сейчас, что вы должны проверить этот файл запроса. Таким образом, в основном вы изменяете свойство "setup.exe -url"
на uid
перед возвратом файла. Например, измените его на /WebDir/uid/MyApp.Application
[G-2]. Вы можете использовать MsiStuff.exe , чтобы изменить свойство URL для загрузчика.
- Используя файл
.htaccess
, переписать [G-2] в /WebDir/Handler.php?user=uid
. Начиная с Handler.php
, вы можете проверить, является ли он действительным uid
. Если он действителен, вам нужно будет включить uid
в URL поставщика развертывания и «Путь к зависимым сборкам» в манифесте развертывания, чтобы в случае поступления запроса на обновление (по сути, он запрашивал манифест развертывания), вы могли проверить пользователя там. тоже. Добавьте uid
к параметрам строки запроса. Например, измените его на /WebDir/MyApp.application?user=uid
[G-3]. Не забывайте, что вам придется отказаться от манифестов, как только вы измените их. Для этого используйте Mage или напишите собственный код.
Итак, наконец, запросы GET на сервере будут (при условии uid
= 1f3rd)
G-1. GET /WebDir/Download.php
Действие: возврат setup.exe
с измененным -url
G-2. GET /WebDir/Application/setup.exe/1f3rd/MyApp.Application
Действие: перенаправление, проверка пользователя, изменение URL, повторная подпись и возврат файла
G-3. GET /WebDir/Application/setup.exe/MyApp.Application?user=1f3rd
Действие: перенаправить, проверить пользователя и вернуть файл
G-4. GET /WebDir/Application/1f3rd/Application Files/MyApp_1_0_0_0/MyApp.exe.manifest
Действие: перенаправить, проверить пользователя и вернуть файл
G-5. GET /WebDir/Application/1f3rd/Application Files/MyApp_1_0_0_0/MyApp.exe.deploy
и другие файлы .deploy ...
Действие: перенаправить, проверить пользователя и вернуть файл
Плюсы
- Приложение успешно развернуто и обновлено только , если во всех запросах указан действительный
uid
в URL-адресе.
- Теперь вы можете идентифицировать различные экземпляры приложения в клиентских системах. Вы можете отслеживать историю обновлений, делать выборочное обновление / понижение версии и многое другое!
против
- Для реализации описанного выше вам потребуется сервер Windows, так как вам нужен mage.exe | Ваше собственное приложение для подписи кода .NET и Msistuff.exe.
- У вас могут быть незначительные проблемы с производительностью, так как вы выполняете проверку для каждого запроса файла. Вы можете пропустить проверку при запросах файлов .manifest и .deploy.
- Вы должны будете обеспечить надлежащую безопасность сертификата компаний, который будет присутствовать на веб-сервере для подписи (Вы можете сохранить его в локальной файловой системе сервера, если у вас есть полный сервер для себя. В этом случае это хорошо, если кто-то не врывается в саму машину!)
Если вы хотите, чтобы я что-то прояснил или подробно объяснил, не стесняйтесь спрашивать. Если у вас есть предложения по изменению вышеперечисленного, опубликуйте это тоже.
Я напишу подробную статью о CodeProject, если у меня когда-нибудь будет свободное время.