Я бы хотел создать плагиновую систему со следующими функциями:
- загружая внешние плагины из источников, которые потенциально не доверяют мне (разработчику), но доверяют конечному пользователю, который установил плагин
- предоставление разрешений для каждого плагина в пределах определенной области; например, один плагин может иметь разрешение на чтение файлов из определенного места, в то время как другим может быть разрешено подключаться к определенному местоположению веб-сайта
- особый случай разрешений для каждого подключаемого модуля: взаимодействует с другим объектом, скорее всего, предоставляется как экземпляр интерфейса, не обращаясь к каким-либо его непубличным членам (даже не поддающимся поиску методам отражения)
- предотвращение действий, которые конечный пользователь не согласился, например, доступ к непубличным членам или работа в файловой системе, прежде чем код плагина может нанести какой-либо вред
Во время моего поиска я в основном нашел SO-решения, включающие Code Access Security, которые, насколько мне известно, устарели от.NET 4.x. Я также немного ознакомился с новой моделью безопасности на страницах MSDN, и, похоже, здесь понадобится библиотечный код, который предоставляет защищенные ресурсы; однако я не мог найти примеров, показывающих, как применять такой код. Я предполагаю, что это будет связано с созданием отдельных AppDomains и, возможно, игрой с основными разрешениями, но это касается моих знаний.
На стороне примечания, я также нашел упоминания о требовании строго названных сборок, но я не уверен, что этого будет достаточно. Если я не ошибаюсь, одно из преимуществ сильного именования заключается в том, что разработчик плагина может подтвердить свою собственную идентификацию, подписав хэш сборки с собственным личным ключом, а другие могут проверить с помощью общеизвестного и надежного открытого ключа. Однако это само по себе кажется слишком негибким, поскольку он либо требует, чтобы разработчик лично решал, чей код следует доверять, или просто доверять любому, кто научился подписывать свою сборку.
Я буду очень благодарен за хороший пример кода управления безопасностью, используя самую последнюю модель безопасности. Что я сейчас имею в виду:
- интерфейс для обслуживания, отображающий потенциально чувствительные операции (например, A и B)
- фиктивная реализация услуги, сосредоточенная на предотвращении несанкционированного выполнения этих операций
- два плагина из отдельных сборок, один с разрешением на выполнение операции A и другой с разрешением на операцию B
- приложение, которое устанавливает службу, загружает сборки с помощью плагинов и пытается выполнить операции для каждого из них, так что неавторизованные операции блокируются и авторизированные операции выполняются правильно
- при запуске внутри приложения ни один из плагинов сам по себе не должен иметь доступ к общим чувствительным API, таким как ввод/вывод файлов или сети, но это должно быть возможно сделать через службу
- все, что при соблюдении этих рекомендаций настолько близко, насколько это возможно (в отличие от решений на основе CAS из вопросов SO начиная с 2010 года)
Конечно, вы можете предложить альтернативную архитектуру, если она достигнет цели в лучшем виде.