Подтвердить что ты не робот

Почему мое приложение .net требует полного доверия?

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

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

Я попробовал инструмент "Вычислить разрешения" на вкладке "Безопасность" моего проекта под визуальной студией, и ответ довольно ясен:

---------------------------
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 и получаю доступ к файловой системе только по запросу пользователя для целей импорта/экспорта)

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

4b9b3361

Ответ 1

Добавление атрибута 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>

Это сделало трюк для меня!

Ответ 2

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

Цитата из msdn

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

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

[assembly:AllowPartiallyTrustedCallers]

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

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

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

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

Ответ 3

У 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" /> 
...

Ответ 4

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

System.Security.Permissions.SecurityAction.LinkDemand

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

Ответ 5

Hrm, просто догадаться, но не работает ли сетевой ресурс? Кажется, что .NET назначает доверие, основанное на местоположении, из которого выполняется код. Если он где-нибудь, кроме локального жесткого диска, у вас будут проблемы с безопасностью.

Ответ 6

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

Ответ 7

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

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

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