2009-05-04 12 views
0

Ich habe ein Problem bei der Identität eines Benutzers. Ich habe eine Methode wie folgt erklärt:Deklarative Sicherheitsanforderungen - Wird SecurityAction.Demand zwischengespeichert?

[PrincipalPermission(SecurityAction.Demand, [email protected]"DJPITER-PC\Test", Role="LocalTestGroup")] 
static void LocalTestGroupOnly() 
{ 
    Console.WriteLine("Inside LocalTestGroupOnly() - {0}", 
     WindowsIdentity.GetCurrent().Name); 
} 

Die Telefonvorwahl ist:

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."); 
    } 

Standardbenutzer ist nicht Mitglied in LocalTestGroup. Benutzer, der von Token IS-Mitglied von LocalTestGroup angegeben wird.

Das Problem:

Der erste Aufruf von LocalTestGroupOnly() erfolgreich, weil Benutzer durch das Token angegeben ist Mitglied LocalTestGroup. Der zweite Aufruf (als Standardbenutzer) an LocalTestGroupOnly() sollte fehlschlagen, da der Standardbenutzer nicht "Test" ist und nicht zu LocalTestGroup gehört. Das Problem ist, dass diese Methode auch erfolgreich ist.

Wenn ich das Programm separat ausführen - mit und ohne Identitätswechsel das Verhalten uns richtig: es gelingt bei der Identität als 'Test' und fehlschlägt beim Aufruf als Standardbenutzer.

Was ist das Problem hier?

Antwort

1

Konnten Sie Thread.CurrentPrincipal.Identity anstelle von WindowsIdentity.GetCurrent() überprüfen? PrincipalPermission.Demand() verwendet die erste.

Zum Ändern (oder HttpContext.User) scheint es, dass Sie sie explizit nach Identitätswechsel oder nach einem Rückgängig machen müssen. Überprüfen Sie here für eine ähnliche Frage.

+0

In der Tat: nach context.Undo() musste ich hinzufügen Thread.CurrentPrincipal = new WindowsPrincipal (WindowsIdentity.GetCurrent()); Warum hat die Undo() Methode das nicht gemacht? Es scheint, dass ich den Thread.CurrentPrincipal und WindowsImpersonationContext nicht vollständig verstehe ... – pkolodziej

+0

Ich habe einige Beispiele nachgeschlagen und sie alle legen Thread.CurrentPrincipal explizit fest, wenn sie sich imitieren. Ich fügte meiner Antwort einige weitere Informationen hinzu. –

+0

Danke - einen schönen Tag. – pkolodziej

Verwandte Themen