Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 安全和MAF插件_.net_Wpf_Appdomain_Add On_Maf - Fatal编程技术网

.net 安全和MAF插件

.net 安全和MAF插件,.net,wpf,appdomain,add-on,maf,.net,Wpf,Appdomain,Add On,Maf,我想构建一个WPF系统,它可以合并由外部开发人员社区开发的插件。因为我不能为这些开发人员担保,所以我希望他们的代码能够在安全的环境中运行。 似乎MAF是一个很好的解决方案,所以我决定调查MAF的安全性。 可以为每个插件定义一个精确的权限集,这非常好 但是,我希望插件能够返回WPF控件。为此,他们需要能够运行WPF程序集。此外,我不希望加载项能够运行非托管代码,这样它们就不能覆盖我在加载加载项时设置的安全权限 问题是,如果我在没有运行非托管代码权限的情况下加载加载项,那么加载项将无法创建WPF控件

我想构建一个WPF系统,它可以合并由外部开发人员社区开发的插件。因为我不能为这些开发人员担保,所以我希望他们的代码能够在安全的环境中运行。 似乎MAF是一个很好的解决方案,所以我决定调查MAF的安全性。 可以为每个插件定义一个精确的权限集,这非常好

但是,我希望插件能够返回WPF控件。为此,他们需要能够运行WPF程序集。此外,我不希望加载项能够运行非托管代码,这样它们就不能覆盖我在加载加载项时设置的安全权限

问题是,如果我在没有运行非托管代码权限的情况下加载加载项,那么加载项将无法创建WPF控件。我怎样才能解决这个问题

为了进一步测试这个问题,我编写了一个小的WPF应用程序,并尝试从第二个应用程序加载和运行它。下面是加载和运行WPF应用程序的代码。如果按原样运行,效果很好,但是如果我删除了最后一条AddPermission语句(带有UnmanageCode标志的语句),那么它将停止工作,并表示它无法创建WPF应用程序的窗口

PermissionSet set = new PermissionSet(PermissionState.None);
set.AddPermission(new FileIOPermission(FileIOPermissionAccess.AllAccess, PATH));
set.AddPermission(new SecurityPermission(SecurityPermissionFlag.Execution));
set.AddPermission(new UIPermission(PermissionState.Unrestricted));
set.AddPermission(new SecurityPermission(SecurityPermissionFlag.UnmanagedCode));

Evidence ev = new Evidence();
AppDomain domain = AppDomain.CreateDomain("Test", ev, new AppDomainSetup() { ApplicationBase = PATH }, set);
domain.ExecuteAssembly(PATH);
您有没有看过CreateDomain方法的重载?您可以设置一些assebmilies,这些assebmilies将被视为完全信任

如果查看System.AddIn源代码(已找到),您将看到在AddInActivator.cs文件中,他们创建了一个使用的实例,该实例是从System.AddIn程序集中获取的

因此,您可以对PresentationCore和System.Windows.Presentation或任何其他要授予完全信任的程序集执行相同的操作

例如,您可以尝试以下方法(几乎是逐字从AddInActivator.cs获取):


这对我来说很有效,我认为问题在于如何激活插件。尽量不要自己创建AppDomain。您的代码应该如下所示:

PermissionSet set = new PermissionSet(PermissionState.None);
set.AddPermission(new FileIOPermission(FileIOPermissionAccess.AllAccess, PATH));
set.AddPermission(new SecurityPermission(SecurityPermissionFlag.Execution));
set.AddPermission(new UIPermission(PermissionState.Unrestricted));

// .. retreive the addin token
var plugin = token.Activate<IMyPluginInterface>(set);
PermissionSet set=新的PermissionSet(PermissionState.None);
set.AddPermission(新建FileIOPermission(FileIOPermissionAccess.AllAccess,PATH));
set.AddPermission(新的SecurityPermission(SecurityPermissionFlag.Execution));
set.AddPermission(新UIPermission(PermissionState.Unrestricted));
// .. 检索加载项令牌
var plugin=token.Activate(设置);
当我用这种方式创建插件时,它对我很有用。它也是一个wpf用户界面

PermissionSet set = new PermissionSet(PermissionState.None);
set.AddPermission(new FileIOPermission(FileIOPermissionAccess.AllAccess, PATH));
set.AddPermission(new SecurityPermission(SecurityPermissionFlag.Execution));
set.AddPermission(new UIPermission(PermissionState.Unrestricted));

// .. retreive the addin token
var plugin = token.Activate<IMyPluginInterface>(set);