Я занимаюсь разработкой приложения, которое должно загружать плагины в отдельные дочерние домены приложений.Только один плагин загружается в один дочерний домен приложения.Для каждого подключаемого модуля требуются разные идентификаторы 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 () , используется при открытии соединения с базой данных. Значением, возвращаемым методом, является либо идентификация процесса, либо олицетворенная идентификация.
Поскольку удостоверение процесса не имеет разрешений, необходимых для работы с базами данных, это неприемлемо. Поэтому имитация должна действовать. Однако олицетворение должно выполняться только в дочерних доменах приложений. Каждый подключаемый модульраскрывает используемые методывыполнить загрузку и выгрузку плагина.Я понимаю, что я должен выполнить олицетворение в начале и отменить олицетворение в конце этих методов.Однако олицетворение должно выполняться для всех потоков, порожденных в дочерних доменах приложений.Поскольку каждый плагин загружает один или несколько своих дочерних плагинов и каждый плагин может порождать один или несколько потоков, олицетворение придется выполнять во многих местах, и это выглядит очень грязно.
Можно ли выполнить олицетворение только один раз , чтобы это затронуло все потоки, порожденные в дочерних доменах приложений?