Deklarative Sicherheitsanforderungen - Ist SecurityAction.Demand zwischengespeichert?
-
03-07-2019 - |
Frage
Ich habe ein Problem während eines Benutzeridentitätswechsel. Ich habe eine Methode wie folgt erklärt:
[PrincipalPermission(SecurityAction.Demand, Name=@"DJPITER-PC\Test", Role="LocalTestGroup")]
static void LocalTestGroupOnly()
{
Console.WriteLine("Inside LocalTestGroupOnly() - {0}",
WindowsIdentity.GetCurrent().Name);
}
Die Telefonvorwahl lautet:
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, die durch Token ist Mitglied LocalTestGroup.
Das Problem:
Der erste Aufruf von LocalTestGroupOnly () erfolgreich, weil Benutzer durch das Token angegeben ist Mitglied LocalTestGroup. Der zweite Aufruf (als Standardbenutzer) zu LocalTestGroupOnly () soll fehlschlagen, weil der Standardbenutzer nicht ‚Test‘ ist, und es gehört nicht zu LocalTestGroup. Das Problem ist, dass diese Methode erfolgreich ist auch.
Wenn ich das Programm ausführen separat - mit und ohne Identitätswechsel des Verhalten uns richtig. Es gelingt, wenn sie als ‚Test‘ Identitätswechsel und schlägt fehl, wenn sie als Standardbenutzer Aufruf
Was ist das Problem hier?
Lösung
Könnten Sie überprüfen Thread.CurrentPrincipal.Identity
statt WindowsIdentity.GetCurrent()
? PrincipalPermission.Demand()
verwendet die erste.
So ändern Thread.CurrentPrincipal
(oder HttpContext.User
) scheint es, dass man sie explizit nach Identitätswechsel oder nach einem Undo einstellen müssen. Überprüfen Sie hier für eine ähnliche Frage .