ASP.NET Различный уровень доверия на странице по сборке? - PullRequest
8 голосов
/ 16 июня 2011

У меня есть два веб-приложения (предварительно скомпилированные сайты), одно из которых является сторонним и будет работать с полным доверием. Другой является сторонним и должен работать с частичным доверием (или с определенными разрешениями).

TrustedAssembly.Web.Pages.MyPage должен работать в домене приложений с полным доверием по умолчанию. UntrustedAssembly.Web.Pages.SomePage должен работать в домене частичного доверия.

Кроме того, если TrustedAssembly.Web.Pages.MyPage динамически загружает UntrustedAssembly.Web.Controls.SomeControl, возможно ли запустить элемент управления с частичным доверием и / или с определенными разрешениями, в то время как страница работает с полным доверием?

И наоборот, например UntrustedAssembly.Web.Controls.SomePage динамически загружает TrustedAssembly.Web.Controls.MyControl, возможно ли запустить элемент управления с полным доверием, пока страница работает с частичным доверием?

Обновление / К вашему сведению: это .NET 4

Ответы [ 2 ]

5 голосов
/ 19 июня 2011

Делать это, вероятно, будет немного сложно.Вот две возможные мысли:

Первый - запустить приложение со средним уровнем доверия, но поместить все, что вы хотите, с полным доверием в GAC, и то, что вы хотите, с частичным доверием, в bin..

Обратите внимание, что в вашем сценарии «наоборот» доверенному элементу управления может потребоваться выполнить «проверку безопасности», прежде чем он сможет выполнить операции полного доверия.Например,

(new SecurityPermission(SecurityPermissionFlag.UnmanagedCode)).Assert();

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

var evidence = new Evidence();
// Initialize the Evidence
Assembly.LoadFrom(path, evidence);

Но имейте в виду, что правильная настройка объекта «Свидетельство» не для слабонервных, и я не уверен, что пошел бы этим путем.

Не полныйответим, но, надеюсь, некоторые идеи, которые могут привести к одному:)

3 голосов
/ 24 июня 2011

+ 1 к Дэвиду Эббо - запуск всего приложения с частичным доверием и повышение прав для вызовов из сборки GACed - это только разумный подход.

Еще несколько моментов, о которых следует подумать ...

  • не многие классы предназначены для удаленного взаимодействия между доменами приложений.ASP.Net не очень удаляемы ...
  • Элементы управления ASP.Net имеют очень много точек интеграции со временем выполнения.Вам нужно будет создать очень интересные прокси-классы, чтобы должным образом ограничить взаимодействия между элементами управления и средой выполнения, чтобы избежать потенциальных повышений и иметь правильный междоменный маршаллинг.
  • легко «утекать» классы из других сборок через границы домена(Пользовательская загрузка из пользовательского местоположения помогает предотвратить «утечки», делая сбои более очевидными).Использование фреймворка с большим количеством точек расширения (переопределений, событий), таких как ASP.Net, дает больше возможностей для переноса объектов между доменами.
  • это не поможет вам запустить произвольный код в вашем процессе - вы объявляете доверие (не-CLR смысл) к пользовательскому коду, просто загрузив в ваш процесс.Т.е. StackOverflow достижимо с помощью кода, у которого есть только разрешения на выполнение, и он в равной степени остановит ваш процесс.
...