Je rencontre des problèmes lors de l'usurpation d'identité d'un utilisateur. J'ai une méthode déclarée comme ceci:Demandes de sécurité déclaratives - SecurityAction.Demand est-il mis en cache?
[PrincipalPermission(SecurityAction.Demand, [email protected]"DJPITER-PC\Test", Role="LocalTestGroup")]
static void LocalTestGroupOnly()
{
Console.WriteLine("Inside LocalTestGroupOnly() - {0}",
WindowsIdentity.GetCurrent().Name);
}
Le code d'appel est:
WindowsImpersonationContext context =
WindowsIdentity.Impersonate(token);
Console.WriteLine("Calling LocalTestGroupOnly() as {0}",
WindowsIdentity.GetCurrent().Name);
LocalTestGroupOnly();
context.Undo();
try
{
// Reverted user is displayed properly
Console.WriteLine("Calling LocalTestGroupOnly() as {0}",
WindowsIdentity.GetCurrent().Name);
// This method should fail but if succeeds
LocalTestGroupOnly();
}
catch (SecurityException ex)
{
Console.WriteLine("Your account lacks permission to that function.");
}
utilisateur par défaut n'est pas membre de LocalTestGroup. Utilisateur indiqué par jeton IS membre de LocalTestGroup.
Le problème:
Le premier appel à LocalTestGroupOnly() parce que l'utilisateur indiqué parvient par le jeton est membre de LocalTestGroup. Le deuxième appel (en tant qu'utilisateur par défaut) à LocalTestGroupOnly() doit échouer car l'utilisateur par défaut n'est pas 'Test' et n'appartient pas à LocalTestGroup. Le problème est que cette méthode réussit aussi. Si j'exécute le programme séparément - avec et sans usurpation d'identité le comportement nous correct: il réussit en usurpant l'identité en tant que 'Test' et échoue en appelant en tant qu'utilisateur par défaut.
Quel est le problème ici?
En effet: après context.Undo() j'ai dû ajouter Thread.CurrentPrincipal = new WindowsPrincipal (WindowsIdentity.GetCurrent()); Pourquoi la méthode Undo() n'a-t-elle pas fait cela? Il semble que je ne comprends pas complètement le Thread.CurrentPrincipal et WindowsImpersonationContext ... – pkolodziej
J'ai recherché quelques exemples et ils ont tous explicitement défini Thread.CurrentPrincipal lors de l'emprunt d'identité. J'ai ajouté quelques informations à ma réponse. –
Merci - passez une bonne journée. – pkolodziej