Доброго времени суток.
Перейду сразу к делу.
На машине установлен КриптоПро .Net 1.0.4863.0 с КриптоПро CSP 3.6.7777. Все отлично работало и всех устраивало до тех пор, пока не появилась необходимость запустить на этой же машине приложение, которое поддерживает работу с плагинами, которые, для безопасности исполнения, запускаются в отдельных AppDomain'ах с ограниченным набором прав. Проблема в том, что при выполнении чего-то в роде:
var path = AppDomain.CurrentDomain.BaseDirectory + "\\Plugins";
var domainSetup = new AppDomainSetup();
domainSetup.ApplicationBase = AppDomain.CurrentDomain.BaseDirectory;
domainSetup.PrivateBinPath = "plugins;bin";
var permmisions = new PermissionSet(PermissionState.None);
permmisions.AddPermission(new ReflectionPermission(ReflectionPermissionFlag.MemberAccess));
permmisions.AddPermission(new SecurityPermission(SecurityPermissionFlag.Execution));
permmisions.AddPermission(new UIPermission(UIPermissionWindow.AllWindows));
permmisions.AddPermission(new FileIOPermission(FileIOPermissionAccess.PathDiscovery | FileIOPermissionAccess.Read, path));
var newAppDomain = AppDomain.CreateDomain("XYZ", null, domainSetup, permmisions);
мы получаем ошибку:
System.Security.SecurityException: Сбой при запросе.
в System.RuntimeMethodHandle.PerformSecurityCheck(Object obj, RuntimeMethodHandleInternal method, RuntimeType parent, UInt32 invocationFlags)
в System.RuntimeMethodHandle.PerformSecurityCheck(Object obj, IRuntimeMethodInfo method, RuntimeType parent, UInt32 invocationFlags)
в System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
в CryptoPro.Sharpei.NetDetours.DomainNeutralDet.TracedInvoke(MethodInfo mi, Object obj, Object[] parameters)
в CryptoPro.Sharpei.NetDetours.DomainNeutralDet.MakeOne(Type targetType, DetourDescription item, AssemblyName assemblyName)
в CryptoPro.Sharpei.NetDetours.DomainNeutralDet.MakeOneAssembly(DetourDescription item, AssemblyName assemblyName)
в CryptoPro.Sharpei.NetDetours.DomainNeutralDet.DetourAssembly(DetDescriptionList allGroups, Assembly toDet)
в CryptoPro.Sharpei.NetDetours.CrossDomainList.InitOnNewDomainPolicyNeutralCreateDomain()
в System.AppDomain.DoCallBack(CrossAppDomainDelegate callBackDelegate)
в CryptoPro.Sharpei.NetDetours.CrossDomainList.CreateDomain(AppDomain newDomain)
в CryptoPro.Sharpei.NetDetours.CPAppDomain.CreateDomain(String friendlyName, Evidence securityInfo, AppDomainSetup info)
строка "var newAppDomain = AppDomain.CreateDomain("XYZ", null, domainSetup, permmisions);"
Ошибкой завершилось следующее действие:
Demand
Ошибкой завершилось первое разрешение следующего типа:
System.Security.PermissionSet
Было предъявлено следующее требование:
<PermissionSet class="System.Security.PermissionSet"
version="1"
Unrestricted="true"/>
Для сбойной сборки был предоставлен следующий набор:
<PermissionSet class="System.Security.PermissionSet"
version="1">
<IPermission class="System.Security.Permissions.FileIOPermission, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
version="1"
Read="[Значение path]"
PathDiscovery="[Значение path]"/>
<IPermission class="System.Security.Permissions.ReflectionPermission, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
version="1"
Flags="MemberAccess"/>
<IPermission class="System.Security.Permissions.SecurityPermission, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
version="1"
Flags="Execution"/>
<IPermission class="System.Security.Permissions.UIPermission, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
version="1"
Window="AllWindows"/>
</PermissionSet>
Ошибкой завершилась следующая сборка или AppDomain:
CryptoPro.Sharpei.CorLib, Version=1.4.0.11, Culture=neutral, PublicKeyToken=473b8c5086e795f5
Ошибкой завершилась сборка со следующим параметром Zone:
MyComputer
Ошибкой завершилась сборка со следующим параметром URL:
file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/CryptoPro.Sharpei.CorLib/v4.0_1.4.0.11__473b8c5086e795f5/CryptoPro.Sharpei.CorLib.dll
Судя по всему, при создании домена в нем начала орудовать сборка "CryptoPro.Sharpei.CorLib", ей не хватило прав и она потянула за собой все остальное. Очень неприятная ситуация.
Точно такая же ошибка возникает на машине, где были установлены КриптоПро .Net 1.0.5210.0 и КриптоПро CSP 3.9.8212.
В случае с последней версией КриптоПро .Net 1.0.5425.0 и КриптоПро CSP 3.9.8212 суть ошибки оставалась той же, только ругань была уже не на "CryptoPro.Sharpei.CorLib.dll", а на "mscorlib".
Данный код выполняется без ошибок на машинах без КриптоПро .Net и КриптоПро CSP. Используется .Net 4.5.
Хотелось бы узнать, можно ли как-то решить/обойти данную проблему? Не хочется вставать перед выбором КриптоПро .Net или использование AppDomain'ов на той или иной машине.