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?
risposta
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);
Uno snippet di codice lungo sarebbe bello. Penso che anche il flusso di ExecutionContext debba essere soppresso. – TrustyCoder
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
ha funzionato per il richiedente domanda? –
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ì).
- 1. Come si avvia una discussione sull'architettura del software?
- 2. avvia un timer da una discussione diversa in C#
- 3. sicurezza Discussione in ASP.Net MVC
- 4. handler.post (eseguibile) avvia una nuova discussione?
- 5. sicurezza Discussione di rendimento rendimento con Parallel.ForEach()
- 6. Estrazione di una funzione in un contesto diverso in Python
- 7. Come avere un contesto di sicurezza primaverile nel contesto figlio
- 8. sicurezza Discussione su richiesta di avvio
- 9. Inserimento di un messaggio di pane tostato da una discussione
- 10. sicurezza Discussione con il mucchio-memoria allocata
- 11. sicurezza Discussione e le variabili locali
- 12. Come si apre una finestra su una nuova discussione?
- 13. Contesto thread sicurezza Spring Security
- 14. E 'sempre una cassetta di sicurezza di ignorare sempre InterruptedException chiamando sonno Discussione() in Java
- 15. Perché viene visualizzato un "errore di politica di sicurezza" quando si avvia l'app per iPhone OS?
- 16. Come creare una discussione?
- 17. Come fermare una discussione?
- 18. Come passare in sicurezza un oggetto di contesto in un delegato UIAlertView?
- 19. Come si avvia una ricarica in muratura angolare?
- 20. Come interrompere implicitamente una discussione in un oggetto in C#
- 21. System.Threading.Timer non si avvia?
- 22. Come chiudere una discussione dall'interno?
- 23. pianificazione di una discussione dopo una discussione nell'applicazione iphone
- 24. Mapbox non si avvia in un frammento
- 25. Come terminare una discussione in C#?
- 26. Arresto di un servizio Android da una discussione
- 27. Come posso avviare un servizio in una nuova discussione?
- 28. Determinazione dell'origine di una discussione
- 29. Arresto forzato di una discussione
- 30. Come propagare il contesto di sicurezza primaverile a JMS?
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