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

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

Наш предыдущий выпуск (номер версии 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 находится за пределами этой области транзакции.

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

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

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

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

Спасибо

1 Ответ

1 голос
/ 02 декабря 2011

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

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

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