2011-01-29 12 views
7

Estoy desarrollando una aplicación que necesita cargar complementos en dominios de aplicaciones secundarias separadas. Solo se carga un complemento en el dominio de una aplicación secundaria. Cada complemento requiere una identidad de Windows diferente y esas identidades son diferentes de la identidad de Windows utilizada en el dominio de aplicación predeterminado (principal). Cada complemento carga uno o más de sus plug-ins secundarios.Impersonación de nivel de dominio de aplicación

E.g. La identidad del dominio predeterminado de la aplicación es Autoridad \ Limitada (la autoridad es el nombre de dominio o el nombre de la máquina). Dos complementos se cargan en dos dominios de aplicaciones secundarias. Las identidades de los plug-ins cargados son Autoridad \ Privileged1 y Autoridad \ Privileged2. Autoridad \ Privileged1 y Autoridad \ Privileged2 tener todo el acceso necesario a las bases de datos database1 y database2, respectivamente, mientras que la Autoridad \ Limited no tiene acceso a ninguna de las bases de datos antes mencionados.

Al crear dominio de aplicación hijo, que llaman System.AppDomain.SetThreadPrincipal método de pasar System.Security.Principal.WindowsPrincipal ejemplo. La instancia se creó desde System.Security.Principal.WindowsIdentity instancia creada a partir del token de usuario duplicado (consulte http://support.microsoft.com/kb/306158). He omitido la llamada a WindowsIdentity.Impersonate método ya que estoy en el dominio de aplicación por defecto al crear el WindowsPrincipal ejemplo.

I espera que el establecimiento de los principales dominios de aplicaciones hilo sería suficiente para los plug-ins cargados para iniciar sesión con éxito en a sus respectivas bases de datos y ejecutan algunas declaraciones T-SQL. Para mi sorpresa, el valor devuelto por WindowsIdentity.GetCurrent() método se utiliza al abrir una conexión a la base de datos. El valor devuelto por el método es identidad de proceso o identidad suplantada.

Dado que la identidad del proceso no tiene los permisos necesarios para trabajar con las bases de datos, no es aceptable. Por lo tanto, la personificación debe entrar en juego. Sin embargo, la suplantación debe tener lugar solo en los dominios de aplicaciones para niños. Cada plug-in expone los métodos utilizados para realizar la carga y descarga del plug-in. Entiendo que tengo que realizar la suplantación al principio y deshacer la suplantación al final de esos métodos. Sin embargo, la suplantación se debe hacer para todos los subprocesos generados en los dominios de aplicaciones secundarias también. Dado que cada complemento carga uno o más de sus complementos secundarios y cada complemento podría engendrar uno o más subprocesos, la suplantación tendría que realizarse en muchos lugares, y eso se ve muy desordenado.

¿Es posible realizar la suplantación sola vez por lo que afecta a todos los hilos que se generan en los dominios de aplicaciones hijo?

+1

Podría considerar el uso de procesos secundarios en lugar de dominios secundarios y ejecutar estos procesos en las cuentas deseadas. Configurar explícitamente la comunicación remota complicará las cosas un poco, pero es de suponer que ya tiene una API adecuada para los tipos remotos. –

+0

La aplicación ya admite la ejecución de procesos secundarios bajo identidad arbitraria. Sin embargo, debe admitir lo mismo para los dominios de aplicaciones secundarias. Gracias. –

Respuesta

3

No, no puedo hacer eso - suplantación es por hilo y el mismo hilo puede tener el código de varios dominio de aplicación en una pila de llamadas. Esto es especialmente cierto para los sistemas de complemento donde el código principal (de algún dominio de aplicación principal) llama a la lógica del complemento en un dominio de aplicación separado.

Esencialmente, usted tiene que hacerse pasar antes de llamar al plugin y volver cuando haya terminado. Tenga en cuenta que si el plugin usa threadpool para sus propias operaciones, tendrá que suplantarlo apropiadamente.

+0

Gracias, Alexei. ¿Hay eventos que indiquen que se ha asignado un hilo para ejecutar algún código en un dominio de aplicación y que un hilo ha terminado la ejecución del código? Si existen tales eventos, podría suscribirme a ellos y realizar la suplantación y la reversión en un solo lugar, respetuosamente. –

+0

No lo sé. Nunca lo necesité, leería en remoto y buscaría en el espacio de nombres System.Runtime.Remoting para averiguarlo. –

+0

Bastante justo. Gracias por la sugerencia. –

Cuestiones relacionadas