Ищу альтернативу AppDomain.CreateDomain (строка, свидетельство) из-за устаревшей политики CAS - PullRequest
11 голосов
/ 28 января 2011

Я работаю с книгой Microsoft .Net Framework - Учебное пособие по разработке приложений, глава 8, урок 2. Настройка доменов приложений

ShowWinIni - имя сборки для программы, которую я хочу выполнить

object[] hostEvidence = { new Zone(SecurityZone.MyComputer) };
Evidence e = new Evidence(hostEvidence, null);

// Create an AppDomain.
AppDomain d = AppDomain.CreateDomain("New Domain", e);

// Run the assembly
d.ExecuteAssemblyByName("ShowWinIni");

Когда я выполняю:

AppDomain d = AppDomain.CreateDomain("New Domain", e);

Я получаю следующее сообщение: «Этот метод неявно использует политику CAS, которая была устаревшей .NET Framework. Чтобы включить политику CAS по соображениям совместимости, используйте переключатель конфигурации NetFx40_LegacySecurityPolicy. Для получения дополнительной информации см. http://go.microsoft.com/fwlink/?LinkID=155570».

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

Конечно, я посетил http://go.microsoft.com/fwlink/?LinkID=155570, но я все еще не понимаю, как создать домен приложения с указанными привилегиями.

Следующим наиболее полезным сайтом, который я нашел, был http://msdn.microsoft.com/en-us/library/bb763046.aspx, но мой объект StrongName вычисляется как NULL.

StrongName fullTrustAssembly =
     typeof(Program).Assembly.Evidence.GetHostEvidence<StrongName>();

Программа - это имя класса, реализующего весь этот код.

Заранее спасибо за советы и подсказки!

Ответы [ 2 ]

11 голосов
/ 07 февраля 2011

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

EvidenceBase[] hostEvidence = { new Zone(SecurityZone.MyComputer) };
Evidence e = new Evidence(hostEvidence, null);

AppDomain d = AppDomain.CreateDomain("New Domain", e);

d.ExecuteAssemblyByName("ShowWinIni");

Это не будет работать, если вы измените SecurityZone на Internet, он попытается использовать устаревшую защиту CASполитика, приводящая к NotSupportedException.Что я хочу, так это SecurityException ... это означает, что сборка, которую я хочу выполнить, не имеет необходимых разрешений.

Чтобы выполнить сборку в домене приложения с ограниченными разрешениями, вам нужно использовать изолированную программную среду.Лучший пример песочницы, который я нашел, находится здесь: http://www.simple -talk.com / dotnet / .net-framework / whats-new-in-code-access-security-in-.net-framework-4.0---part-i /

Я думаю, что эта страница также очень хорошо объясняет изменения, внесенные в CAS в 4.0!

Многие источники, включая MSDN, убедили меня, что мне нужно предоставитьМассив StrongName при вызове:

AppDomain.CreateDomain( string friendlyName,
                        Evidence securityInfo,
                        AppDomainSetup info,
                        PermissionSet grantSet,
                        params StrongName[] fullTrustAssemblies);

Как указано в моем исходном сообщении, у меня были (и остаются) проблемы с получением объекта StrongName вместо null.Оказывается, мне это даже не нужно!

Это мой законченный пример для песочницы:

Evidence ev = new Evidence();
ev.AddHostEvidence(new Zone(SecurityZone.Internet));
PermissionSet internetPS = SecurityManager.GetStandardSandbox(ev);

AppDomainSetup adSetup = new AppDomainSetup();
adSetup.ApplicationBase = Path.GetFullPath(pathToUntrusted);

AppDomain newDomain = AppDomain.CreateDomain("Sandbox Domain", null, adSetup, internetPS);

newDomain.ExecuteAssemblyByName(untrustedAssembly);

pathToUntrusted = строковое представление пути к файлу для моей сборки

untrustedAssembly = строковое представление имени сборки

7 голосов
/ 29 января 2011

Обратившись за помощью к коллегам, я получил эту работу.

Очевидно, что упражнение книги было разработано для использования в среде 3.5 .Net, а я использую 4.0.После изменения свойств моего проекта и проекта ShowWinIni для использования платформы 3.5 все работало ... но я все еще хотел сделать эту работу с инфраструктурой 4.0.

Чтобы устранить следующее сообщение: "Этот метод неявноиспользует политику CAS, которая была устаревшей .NET Framework. Чтобы включить политику CAS по причинам совместимости, используйте переключатель конфигурации NetFx40_LegacySecurityPolicy. Для получения дополнительной информации см. http://go.microsoft.com/fwlink/?LinkID=155570. "

Я создал файл app.config и добавил к нему следующее:

<configuration>
   <runtime>
      <NetFx40_LegacySecurityPolicy enabled="true"/>
   </runtime>
</configuration>

Подробнее о NetFx40_LegacySecurityPolicy можно прочитать по адресу http://msdn.microsoft.com/en-us/library/dd409253.aspx

В результате моя программа стала ненадежным приложением.Исключение безопасности, когда я пытался отладить.Чтобы снова сделать приложение надежным, я включил параметры безопасности ClickOnce и отметил «Это приложение с полным доверием» в свойствах моего проекта.

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

d.ExecuteAssemblyByName("ShowWinIni");

Этот оператор работал хорошо, прежде чем я начал пытаться включить объект Evidence при создании объекта AppDomain.Ну, оказывается, есть еще один метод ... AppDomain.ExecuteAssemblyByName (строка, свидетельство), о котором вы можете прочитать в http://msdn.microsoft.com/en-us/library/5kd4z003.aspx.. Поэтому я заменил приведенный выше фрагмент кода следующим:

d.ExecuteAssemblyByName("ShowWinIni", e);

'e' - это объект Evidence, созданный в моем первоначальном вопросе.

Теперь я НЕ думаю, что это лучшее решение.В идеале я не хотел бы, чтобы моя программа использовала NetFx40_LegacySecurityPolicy, и я считаю, что приложения реального мира не должны полагаться на устаревшие методы.Я думал, что это решение стоит опубликовать, если кто-то будет работать с той же книгой, что и я.

...