2009-05-04 7 views
0

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?

Répondre

1

Pourriez-vous vérifier Thread.CurrentPrincipal.Identity au lieu de WindowsIdentity.GetCurrent()? PrincipalPermission.Demand() utilise le premier.

Pour changer Thread.CurrentPrincipal (ou HttpContext.User), il semble que vous deviez les définir explicitement après une usurpation d'identité ou après une annulation. Vérifiez here pour une question similaire.

+0

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

+0

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. –

+0

Merci - passez une bonne journée. – pkolodziej

Questions connexes