Олицетворение уровня домена приложения - PullRequest
7 голосов
/ 29 января 2011

Я занимаюсь разработкой приложения, которое должно загружать плагины в отдельные дочерние домены приложений.Только один плагин загружается в один дочерний домен приложения.Для каждого подключаемого модуля требуются разные идентификаторы Windows, и эти идентификаторы отличаются от идентификаторов Windows, используемых в домене приложения по умолчанию (родительском).Каждый плагин загружает один или несколько дочерних плагинов.

Например, идентификатор домена приложения по умолчанию: Authority \ Limited (полномочия - это либо имя домена, либо имя компьютера).Два плагина загружаются в два дочерних домена приложения.Идентификационные данные загруженных плагинов: Authority \ Privileged1 и Authority \ Privileged2 . Authority \ Privileged1 и Authority \ Privileged2 имеют все необходимые права доступа к базам данных Database1 и Database2 соответственно, тогда как Authority \Ограниченный не имеет доступа ни к одной из вышеупомянутых баз данных.

При создании дочернего домена приложения я вызываю System.AppDomain.SetThreadPrincipal метод, передающий System.Security.Principal.WindowsPrincipal экземпляр.Экземпляр был создан из System.Security.Principal.WindowsIdentity Экземпляр, созданный из дублированного токена пользователя (см. http://support.microsoft.com/kb/306158). Я пропустил вызов метода WindowsIdentity.Impersonate , так как яЯ нахожусь в домене приложения по умолчанию при создании экземпляра WIndowsPrincipal .

Я ожидал, что установки принципала потока доменов приложений будет достаточно для загруженных плагинов, чтобы успешно войти в свои соответствующие базы данных ивыполнить некоторые операторы T-SQL. К моему удивлению, значение, возвращаемое методом WindowsIdentity.GetCurrent () , используется при открытии соединения с базой данных. Значением, возвращаемым методом, является либо идентификация процесса, либо олицетворенная идентификация.

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

Можно ли выполнить олицетворение только один раз , чтобы это затронуло все потоки, порожденные в дочерних доменах приложений?

1 Ответ

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

Нет, вы не можете этого сделать - олицетворение для каждого потока, и один и тот же поток может иметь код из нескольких доменов приложений в стеке вызовов.Это особенно верно для систем плагинов, в которых основной код (из некоторого основного AppDomain) вызывает логику плагина в отдельном домене приложений.

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

...