0

外部開発者コミュニティが開発したアドインを組み込むことができる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);
4

2 に答える 2

0

CreateDomainメソッドのこのオーバーロードを見ましたか?完全な信頼と見なされるいくつかのアセンブリを設定できます。

System.AddInソースコード(ここにあります)を見ると、ファイルAddInActivator.csで、System.AddInアセンブリから取得したAssemblyNameから取得したStrongNamePublicKeyBlobを使用してStrongNameのインスタンスが作成されていることがわかります。

したがって、PresentationCoreとSystem.Windows.Presentation、または完全な信頼を付与したい他のアセンブリでも同じことができるかもしれません。

たとえば、これを試すことができます(AddInActivator.csからほぼ逐語的に取得):

//assembly is the Assembly object you want to grant full trust permissions.
AssemblyName assemblyName = assembly.GetName();

// get the public key blob
byte[] publicKey = assemblyName.GetPublicKey(); 
if (publicKey == null || publicKey.Length == 0)
    throw new InvalidOperationException(Res.NoStrongName);

StrongNamePublicKeyBlob keyBlob = new StrongNamePublicKeyBlob(publicKey); 

// and create the StrongName 
StrongName strongName = new StrongName(keyBlob, assemblyName.Name, assemblyName.Version); 
// then call the overload of CreatDomain that takes a StrongName object parametes.
于 2012-06-05T12:08:23.410 に答える
0

問題はプラグインを有効にする方法にあると思います。自分で 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);

この方法でプラグインを作成していたときはうまくいきました。これも wpf UI でした。

于 2013-09-24T06:00:58.933 に答える