2012-05-10 2 views
0

외부 개발자 커뮤니티에서 개발 한 addin을 통합 할 수있는 WPF 시스템을 만들고 싶습니다. 개발자들에게 보증 할 수 없기 때문에 코드를 안전한 환경에서 실행하고 싶습니다. MAF가 좋은 해결책 인 것 같아 MAF의 보안을 조사하기로 결정했습니다. 각 addon에 대한 정확한 권한 집합을 정의 할 수 있습니다. 매우 좋습니다.보안 및 MAF 추가 기능

그러나 AddOns가 WPF 컨트롤을 반환 할 수있게하려고합니다. 이를 위해서는 WPF 어셈블리를 실행할 수 있어야합니다. 또한 애드온을 관리되지 않는 코드로 실행할 수 없기 때문에 애드온을로드 할 때 설정 한 보안 권한을 재정의 할 수 없습니다.

여기에 문제가 있습니다. 관리되지 않는 코드를 실행할 권한이없는 애드온을로드하면 애드온에서 WPF 컨트롤을 만들 수 없습니다. 이 문제를 어떻게 해결할 수 있습니까?

이 문제를 좀 더 테스트하려면 작은 WPF 응용 프로그램을 작성한 후로드하고 두 번째 응용 프로그램에서 실행하려고했습니다. Bellow는 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); 

답변

0

당신은 createdomain이 방법의 this 과부하를 살펴 있었나요? 완전 신뢰로 간주되는 일부 집합을 설정할 수 있습니다.

당신이 (here를 있음) System.AddIn 소스 코드를 살펴있는 경우이 파일 AddInActivator.cs에 그들이 시스템에서 가져온 AssemblyName에서 촬영 한 StrongNamePublicKeyBlob를 사용 StrongName의 인스턴스를 만들 것을 볼 수 있습니다. AddIn 어셈블리.

그러면 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. 
0

, 그 문제는 당신이 플러그인을 활성화하는 방법에 생각합니다. 혼자서 AppDomain을 만들지 마십시오. 귀하의 코드는 다음과 같아야합니다 :

이 방법으로 플러그인을 만들면 저에게 도움이되었습니다. 그것은 또한 wpf UI였습니다.