Почему мое приложение .net требует полного доверия? - PullRequest
12 голосов
/ 17 февраля 2009

Я разработал приложение .net 3.0, которое развертывается с помощью clickonce.

Я бы хотел перейти от полного доверия к частичному доверию, чтобы упростить развертывание.

Я попробовал инструмент «Рассчитать разрешения» на вкладке «Безопасность» моего проекта в Visual Studio, и ответ вполне ясен:

---------------------------
Microsoft Visual Studio
---------------------------
This application requires full trust to run correctly.

Однако я не смог понять, почему требуется полное доверие. Я пытался изменить настройки безопасности на «частичное доверие», но приложение сразу после запуска вызывает исключение SecurityException:

System.Security.SecurityException   {"Request failed.", Action= "System.Security.Permissions.SecurityAction.LinkDemand"
   at MyNameSpace.Program.Main(String[] args)
   at System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
   at System.AppDomain.nExecuteAssembly(Assembly assembly, String[] args)
   at System.Runtime.Hosting.ManifestRunner.Run(Boolean checkAptModel)
   at System.Runtime.Hosting.ManifestRunner.ExecuteAsAssembly()
   at System.Runtime.Hosting.ApplicationActivator.CreateInstance(ActivationContext activationContext, String[] activationCustomData)
   at System.Runtime.Hosting.ApplicationActivator.CreateInstance(ActivationContext activationContext)
   at System.Activator.CreateInstance(ActivationContext activationContext)
   at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssemblyDebugInZone()
   at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
   at System.Threading.ExecutionContext.runTryCode(Object userData)
   at System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode code, CleanupCode backoutCode, Object userData)
   at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Threading.ThreadHelper.ThreadStart()

Моему программному обеспечению, вероятно, не нужно полное доверие (я подключаюсь к веб-серверу только через https и обращаюсь к файловой системе только по запросу пользователя для целей импорта / экспорта)

Как я могу понять, почему мое приложение требует полного доверия?

Ответы [ 7 ]

10 голосов
/ 17 февраля 2009

Кажется, моя проблема вызвана тем, что моя сборка строго подписана.

Цитируется из MSDN

В сборках со строгими именами LinkDemand применяется ко всем общедоступным методам, свойствам и событиям в них, чтобы ограничить их использование полностью доверенными вызывающими. Чтобы отключить эту функцию, необходимо применить атрибут AllowPartiallyTrustedCallersAttributeattribute.

Я добавляю необходимый атрибут в свою сборку и сообщаю вам, как все получается:

[assembly:AllowPartiallyTrustedCallers]

Обновление: я добавил атрибут в свои сборки, но я также использую некоторые .net сборки.

Не все сборки .net могут использоваться частично доверенными сборками ( вот список ), а именно сборок WCF (т.е. System.ServiceModel) нет в списке

Однако Microsoft заявляет, что можно использовать WCF в среде с частичным доверием ( см. Здесь )

Я пытался удалить все ненужные сборки из моих ссылок, я использовал AllowPartiallyTrustedCallers во всех моих сборках, и я все еще застрял ...

4 голосов
/ 17 февраля 2009

У Microsoft есть инструмент под названием permcalc , который анализирует сборку и создает подробный выходной файл XML, который выглядит следующим образом:

<Type Name="MyClass">
<Method Sig="instance void .ctor()">
<Demand>
<PermissionSet version="1" class="System.Security.PermissionSet">
  <IPermission version="1" class="System.Security.Permissions.FileIOPermission, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" Unrestricted="true" /> 
  <IPermission version="1" class="System.Security.Permissions.ReflectionPermission, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" Unrestricted="true" /> 
...
2 голосов
/ 18 февраля 2009

Добавление атрибута requirePermission = 'false' в настройках app.config очень помогает:

 <sectionGroup name="system.net" type="System.Net.Configuration.NetSectionGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
      <section requirePermission="false" name="defaultProxy" type="System.Net.Configuration.DefaultProxySection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
    </sectionGroup>

Это сделало для меня хитрость!

1 голос
/ 17 февраля 2009

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

System.Security.Permissions.SecurityAction.LinkDemand

Если вы скопируете и вставите это в Google, вы найдете несколько соответствующих статей на MSDN, которые могут помочь вам понять, почему вашему приложению требуется полное доверие.

0 голосов
/ 17 февраля 2009

Ваша трассировка стека не показывает тип требуемого разрешения.

AllowPartiallyTrustedCallers не поможет вам в этом случае. Это должно быть указано на вызывающей цели, например когда какой-то частично доверенный код вызывает вашу доверенную сборку. В вашей ситуации вы должны проверить, вызывает ли ваше приложение сборки, для которых этот атрибут не определен. Если да, то ваше приложение должно будет работать с полным доверием и вообще не работать с частичным доверием (именно так CAS применяется и проектируется).

В противном случае используйте permcalc. Он покажет вам разрешения, которые должны быть включены в настройках безопасности проекта. Однако я не уверен, что после включения всех этих разрешений у вас останется «частичное доверие» или, скорее, полное доверие с несколькими урезанными разрешениями. Это связано с тем, что частичное доверие является очень ограничительным (откройте security.config и посмотрите на включенные разрешения!), Насколько я знаю, WebPermission там нет (что необходимо для отправки http-запросов), то же самое с FileIOPermission. 1005 *

0 голосов
/ 17 февраля 2009

Не видя код для вашего приложения, невозможно сказать. Существует нечто , требующее полного доверия к вашему приложению, которое вы могли упустить (возможно, из зависимости?).

0 голосов
/ 17 февраля 2009

Хм, просто предположение, но работает ли он из сетевой папки? Похоже, что .NET назначает доверие на основе местоположения, из которого выполняется код. Если это не из вашего локального жесткого диска, то у вас будут проблемы с безопасностью.

...