Как заставить мое приложение работать в режиме полного доверия - Консольное приложение.NET 4.0

У нас проблема с приложением командной строки (пакетное) и полным / частичным доверием.

Наш предыдущий выпуск (номер версии 7.13.0.63) работает нормально, однако, когда мы устанавливаем новую версию (7.13.0.249), мы получаем "Эта сборка не допускает частично доверенных вызывающих".

Исключение:

Stack Trace (edited):
   at System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor, Boolean& bNeedSecurityCheck)
   at System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache)
   at System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean skipVisibilityChecks, Boolean skipCheckThis, Boolean fillCache)
   at System.Activator.CreateInstance[T]()
   at <Company>.Service.<Product>.Proxy.Factories.ControllerProxyFactory.Create[T]()
   <Stack Trace that leads to creation of a WCF client> ...

Inner Exception:
An error occurred creating the configuration section handler for system.serviceModel/behaviors: That assembly does not allow partially trusted callers. (C:\Program Files (x86)\InsuranceLine\ListLoader\InsuranceLine.ListLoader.Launcher.exe.Config line 53)
Stack Trace:
   at System.Configuration.BaseConfigurationRecord.EvaluateOne(String[] keys, SectionInput input, Boolean isTrusted, FactoryRecord factoryRecord, SectionRecordsectionRecord, Object parentResult)
   at System.Configuration.BaseConfigurationRecord.Evaluate(FactoryRecord factoryRecord, SectionRecord sectionRecord, Object parentResult, Boolean getLkg, Boolean getRuntimeObject, Object& result, Object& resultRuntimeObject)
   at System.Configuration.BaseConfigurationRecord.GetSectionRecursive(String configKey, Boolean getLkg, Boolean checkPermission, Boolean getRuntimeObject, Boolean requestIsHere, Object& result, Object& resultRuntimeObject)
   at System.Configuration.BaseConfigurationRecord.GetSectionRecursive(String configKey, Boolean getLkg, Boolean checkPermission, Boolean getRuntimeObject, Boolean requestIsHere, Object& result, Object& resultRuntimeObject)
   at System.Configuration.BaseConfigurationRecord.GetSectionRecursive(String configKey, Boolean getLkg, Boolean checkPermission, Boolean getRuntimeObject, Boolean requestIsHere, Object& result, Object& resultRuntimeObject)
   at System.Configuration.BaseConfigurationRecord.GetSection(String configKey)
   at System.Configuration.ClientConfigurationSystem.System.Configuration.Internal.IInternalConfigSystem.GetSection(String sectionName)
   at System.Configuration.ConfigurationManager.GetSection(String sectionName)
   at System.ServiceModel.Activation.AspNetEnvironment.UnsafeGetSectionFromConfigurationManager(String sectionPath)
   at System.ServiceModel.Activation.AspNetEnvironment.UnsafeGetConfigurationSection(String sectionPath)
   at System.ServiceModel.Configuration.ConfigurationHelpers.UnsafeGetAssociatedSection(ContextInformation evalContext, String sectionPath)
   at System.ServiceModel.Description.ConfigLoader.LookupChannel(ContextInformation configurationContext, String configurationName, ContractDescription contract, EndpointAddress address, Boolean wildcard, Boolean useChannelElementKind, ServiceEndpoint& serviceEndpoint)
   at System.ServiceModel.ChannelFactory.InitializeEndpoint(String configurationName, EndpointAddress address)
   at System.ServiceModel.ChannelFactory`1..ctor(String endpointConfigurationName, EndpointAddress remoteAddress)
   <Stack Trace that determines the correct WCF factory to create>

Inner Exception:
That assembly does not allow partially trusted callers.
Stack Trace:
   at System.Security.CodeAccessSecurityEngine.ThrowSecurityException(RuntimeAssembly asm, PermissionSet granted, PermissionSet refused, RuntimeMethodHandleInternal rmh, SecurityAction action, Object demand, IPermission permThatFailed)
   at System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor, Boolean& bNeedSecurityCheck)
   at System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache)
   at System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean skipVisibilityChecks, Boolean skipCheckThis, Boolean fillCache)
   at System.Activator.CreateInstance(Type type, Boolean nonPublic)
   at System.ServiceModel.Configuration.ServiceModelExtensionCollectionElement`1.CreateNewSection(String name)
   at System.ServiceModel.Configuration.ServiceModelExtensionCollectionElement`1.DeserializeElementCore(XmlReader reader)
   at System.ServiceModel.Configuration.ServiceModelExtensionCollectionElement`1.DeserializeElement(XmlReader reader, Boolean serializeCollectionKey)
   at System.Configuration.ConfigurationElementCollection.OnDeserializeUnrecognizedElement(String elementName, XmlReader reader)
   at System.Configuration.ConfigurationElement.DeserializeElement(XmlReader reader, Boolean serializeCollectionKey)
   at System.Configuration.ConfigurationElement.DeserializeElement(XmlReader reader, Boolean serializeCollectionKey)
   at System.Configuration.ConfigurationSection.DeserializeSection(XmlReader reader)
   at System.Configuration.RuntimeConfigurationRecord.RuntimeConfigurationFactory.CreateSectionImpl(RuntimeConfigurationRecord configRecord, FactoryRecord factoryRecord, SectionRecord sectionRecord, Object parentConfig, ConfigXmlReader reader)
   at System.Configuration.RuntimeConfigurationRecord.RuntimeConfigurationFactory.CreateSectionWithRestrictedPermissions(RuntimeConfigurationRecord configRecord, FactoryRecord factoryRecord, SectionRecord sectionRecord, Object parentConfig, ConfigXmlReader reader)
   at System.Configuration.RuntimeConfigurationRecord.CreateSection(Boolean inputIsTrusted, FactoryRecord factoryRecord, SectionRecord sectionRecord, Object parentConfig, ConfigXmlReader reader)
   at System.Configuration.BaseConfigurationRecord.CallCreateSection(Boolean inputIsTrusted, FactoryRecord factoryRecord, SectionRecord sectionRecord, Object parentConfig, ConfigXmlReader reader, String filename, Int32 line)

Что касается процесса, который мы используем для развертывания нашего продукта, мы используем MSI, созданный через WiX. Мы выполняем следующие шаги:

  • Удалить предыдущую версию продукта
  • Скопируйте MSI из общего сетевого ресурса (один и тот же ресурс для обеих версий, разные подкаталоги в зависимости от версии)
  • Установите MSI как администратор
    • Это устанавливает в C:\Program Files (x86)

Единственные изменения между двумя версиями:

  • Включение дополнительного элемента AppSettings в файл app.config (myapp.exe.config) для указания времени ожидания транзакции
  • Изменение "использование нового TransactionScope()" на "использование нового TransactionScope(TransactionScopeOption.Required, timeoutValueReadFromAppSettingsAndStoredInLocalVariable)"
    • Создание клиента WCF находится за пределами данной области транзакции.

Дополнительная информация:

  • Исключение не возникает ни в одной из наших сред разработки / разработки /qa/pre. Это происходит только на нашем производственном сервере приложений.
  • Мы находимся в процессе развертывания Windows 7 для нашей организации, поэтому вполне возможно, что корпоративная политика изменилась.
  • Приложение предназначено для.Net Framework 4.0
  • Если мы удаляем новую версию и переустанавливаем старую версию (включая копию с сетевого ресурса), старая версия все еще работает нормально
  • На компьютере установлена ​​Windows Server 2008 R2
  • Машина является виртуальной машиной, размещенной в среде VMWare.

В идеале я хотел бы знать несколько вещей:

  1. Как изменить сборку (или установить разрешения после установки), чтобы она могла работать в режиме полного доверия
  2. Как повторить проблему в средах разработки, разработки и контроля качества
    • Явное "недоверие" к сборке может привести к ее воспроизведению, но я хочу воспроизвести ее так же, как и производственную, чтобы при ее установке она определялась как ненадежная, и мне кажется, что способ сделать это как-то связан с "Не доверяя" сетевому ресурсу, с которого я копирую MSI, или, возможно, "не доверяя" информации издателя в MSI/ сборке.
  3. Как настроить производственный сервер приложений / политику безопасности, чтобы будущие установки были полностью доверенными (ответ на пункт 2, скорее всего, ответит на это)

Спасибо

1 ответ

Это на самом деле довольно странно, учитывая, что.NET 4.0 CLR не применяет политику безопасности CAS по умолчанию, поэтому на самом деле вам придется внести какое-то преднамеренное (надеемся) преднамеренное изменение, чтобы получить локально установленное приложение командной строки, которое будет частично доверенным.

Прежде чем пытаться копать слишком глубоко для потенциальных причин, не могли бы вы проверить следующее:

  1. Содержит ли ваш файл app.config элемент NetFx40_LegacySecurityPolicy?
  2. Ваше приложение на самом деле работает под 4.0 CLR на проблемной машине? (Если вы не можете изменить источник для вывода значения Environment.Version до того, как возникнет исключение, Process Explorer должен позволить вам определить, какие версии CLR запущены в вашем процессе.)
Другие вопросы по тегам