2010-04-09 13 views
13

Come avviare una discussione nel contesto di sicurezza di un altro utente? Quando un processo avvia un thread normalmente viene passato anche il contesto di sicurezza ma come avviare un thread in un contesto di sicurezza diverso con il principal di un utente diverso?Come si avvia una discussione in un contesto di sicurezza diverso?

+0

correlati [post] (https://stackoverflow.com/a/7250145/465053) - Come impersonare un account AD per eseguire un pezzo di codice durante l'esecuzione di un'applicazione? – RBT

risposta

4

Credo che si possa semplicemente impostare CurrentPrincipal come prima operazione del codice di thread dopo che il thread è stato avviato, e solo allora iniziare a eseguire il codice che dovrebbe essere eseguito con l'altro principale.

Questo dovrebbe occuparsi di qualsiasi controllo basato su ruoli .NET. Se è necessaria la rappresentazione anche per le chiamate al sistema operativo, è possibile impersonare lo WindowsIdentity.

codice (può o non può lavorare - non ha testarlo):

public void Run(object principalObj) { 
    if (principalObj == null) { 
     throw new ArgumentNullException("principalObj"); 
    } 
    IPrincipal principal = (IPrincipal)principalObj; 
    Thread.CurrentPrincipal = principal; 
    WindowsIdentity identity = principal.Identity as WindowsIdentity; 
    WindowsImpersonationContext impersonationContext = null; 
    if (identity != null) { 
     impersonationContext = identity.Impersonate(); 
    } 
    try { 
     // your code here 
    } finally { 
     if (impersonationContext != null) { 
      impersonationContext.Undo(); 
     } 
    } 
} 

... 

Thread thread = new Thread(Run); 
thread.Start(yourPrincipal); 
+1

Uno snippet di codice lungo sarebbe bello. Penso che anche il flusso di ExecutionContext debba essere soppresso. – TrustyCoder

+1

Perché il flusso 'ExecutionContext' dovrebbe essere soppresso? Quando si utilizza la rappresentazione (come ho fatto qui), il 'SecurityContext' di' ExecutionContext' viene aggiornato (controllato con Reflector, questo avviene nel metodo interno 'UpdateThreadWI' nell'implementazione MS). – Lucero

+2

ha funzionato per il richiedente domanda? –

1

ho usato tecniche like this per la rappresentazione con successo.

Il termine "Rappresentazione" in un contesto programmazione si riferisce ad una tecnica che esegue il codice sotto altro contesto utente rispetto all'utente che originariamente iniziato un'applicazione, cioè il contesto utente è temporaneamente cambiata una volta o più volte durante l'esecuzione di un'applicazione.

Il motivo per fare questo è quello di eseguire compiti che il contesto di una domanda di corrente utente non è autorizzato a fare. Naturalmente si potrebbe concedere all'utente l'esecuzione di un applicazione più privilegi, ma di solito questo è una cattiva idea (a causa di vincoli di sicurezza) o impossibile (ad esempio, se non si dispone di pieno accesso amministrativo a una macchina per fare così).