Олицетворение на уровне домена приложения

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

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

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

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

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

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

8
задан Rest Wing 29 January 2011 в 14:07
поделиться