Вопрос по appdomain, c#, .net – Ограничить доступ к коду сборки плагинов

5

Я хотел бы создать архитектуру плагинов, в которой я могу ограничить API сборок чем-то очень ограниченным, то есть разрешить только белый список функций. Можно ли ограничить функции / методы, которые может вызывать плагин в сборке? Могу ли я сделать это с помощью AppDomains?

У кого-нибудь есть простой пример?

Отредактировано для атрибута InternalsVisibleTo RCIX
Какие функции / методы вы имеете в виду? Ваши или .NET Framework функции? Arthur
И то, и другое, я мог бы обернуть .NET, если нужно. Dave Hillier

Ваш Ответ

3   ответа
0

Я нашел эту статью.

http://www.15seconds.com/Issue/040121.htm

Уровень политики AppDomain будет вашим

РЕДАКТИРОВАТЬ: довольно сложно предоставить пример кода. Но MSDN должен дать вам несколько полезных советов:http://msdn.microsoft.com/en-us/library/yctbsyf4(VS.71).aspx

Изменить мой ответ: Добавлена ссылка на MSDN Arthur
Это может работать, но при полном доверии все разрешения предоставляются в любом случае. leppie
Но вы можете настроить AppDomain с низким уровнем доверия и загрузить туда свой плагин. Arthur
11

. которая может соответствовать всем требованиям. Он имеет следующие особенности:

изоляция, Плагинызапустить в своем собственном AppDomain при желании или даже ихсобственный процесс если вам нужен этот уровень изоляции.Договорное общение, Вы устанавливаете контракты, и это единственное, что вы распространяете среди авторов плагинов. Им не нужно знать ни о каком другом аспекте вашего заявления.открытие, Имеет встроенный механизм для извлечения плагинов из папки, полной сборок.Безопасность, Наборы CASPOL автоматически применяются при загрузке плагина. Есть несколько опций, встроенных, чтобы сделать это легко (см.AddInSecurityLevel Enum).

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

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

Образец

Вот простой пример. Как автор "Shell", вы будете заключать контракт с авторами ваших плагинов. Вот типичный контракт (это просто абстрактный класс):

public abstract class Calculator 
{
    public abstract double Add(double a, double b);    
    public abstract double Subtract(double a, double b);
    public abstract double Multiply(double a, double b);
    public abstract double Divide(double a, double b);
}

Если автор плагина хочет написать плагин, он просто подклассирует этот контракт и добавляет атрибут «Addin»:

[AddIn("Sample Calculator AddIn", Version="1.0.0.0")]
public class SampleCalculatorAddIn : Calculator
{
    public override double Add(double a, double b)
    {
        return a + b;
    }
    public override double Subtract(double a, double b)
    {
        return a-b;
    }
    public override double Multiply(double a, double b)
    {
        return a * b;
    }
    public override double Divide(double a, double b)
    {
        return a / b;
    }
}

А вот как вы можете загрузить эти надстройки и взаимодействовать с ними:

// In this sample we expect the AddIns and components to 
// be installed in the current directory
String addInRoot = Environment.CurrentDirectory;

// Check to see if new AddIns have been installed
AddInStore.Rebuild(addInRoot);

// Look for Calculator AddIns in our root directory and 
// store the results
Collection<AddInToken> tokens = 
    AddInStore.FindAddIns(typeof(Calculator), addInRoot);

// Ask the user which AddIn they would like to use
AddInToken calcToken = ChooseCalculator(tokens);

// Activate the selected AddInToken in a new AppDomain set sandboxed 
// in the internet zone. You can find out what this gives access
// to by running "mscorcfg.msc", but essentially this will limit
// any access to the filesystem and other obvious OS services.
// Use of reflection is also very limited in this zone.
Calculator calculator = 
    calcToken.Activate<Calculator>(AddInSecurityLevel.Internet);

// Run the read-eval-print loop
RunCalculator(calculator);

Это в значительной степени суть. Очевидно, в этом есть нечто большее, но вы поняли идею.

Дальнейшее чтение

Хорошая вступительная статья
https://web-beta.archive.org/web/20140820145919/http://msdn.microsoft.com/en-us/magazine/cc163476.aspx

Обзор на MSDN
http://msdn.microsoft.com/en-us/library/bb384200.aspx

System.Addin на Codeplex (много образцов)
http://www.codeplex.com/clraddins

инструменты

Трубопроводчик (помогает создать коммуникационный конвейер между оболочкой и надстройками)
http://clraddins.codeplex.com/wikipage?title=Pipeline%20Builder&referringTitle=Home

Правила Fx-Cop для System.Addin
http://clraddins.codeplex.com/wikipage?title=Add-in%20FxCop%20Rules&referringTitle=Home

1

internal ключевое слово для anytihng вы не хотите, чтобы другие сборки, чтобы увидеть, должно работать. Я что-то пропустил?

Что вы делаете, это:

Сделайте все элементы с «полными разрешениями» внутреннимив AssemblyInfo.cs добавьтеInternalsVisibleTo атрибут для каждой сборки, которой вы полностью доверяете. Пример кода:[InternalsVisibleTo("fullNameOfAssemblyFromOtherLibrariesAssemblyInfoFile")]Та-да, весь твой код защищен! (за исключением отражения, которое вы все равно не можете остановить)
Я не понимаю Все, что вы хотите увидеть во внутреннем материале, установите атрибут InternalsVisibleTo в исходной сборке. Сборка плагина не будет иметь этой способности и, следовательно, не увидит ничего, что требует «полных прав». Я отредактирую свой ответ с некоторыми ссылками. RCIX
Вы можете ограничить использование отражения, применив соответствующий CASPOL. Anderson Imes
Да, я хочу, чтобы какой-то код выполнялся с полными разрешениями, а другой - с очень ограниченным набором разрешений. Использование внутреннего запретило бы доступ ко всем сборкам, а не только к подключаемым. Код доступа к безопасности в правильном направлении, он отвечает на первый / второй вопрос, но не на третий, то есть простой пример. Dave Hillier

Похожие вопросы