Was ist der Unterschied zwischen dem Abrufen von Windows -Principal von WindowsIdentity und Thread.CurrentPrincipal?

StackOverflow https://stackoverflow.com/questions/4563446

Frage

Ich versuche herauszufinden, warum Attribut -basierte Sicherheit nicht funktioniert, wie ich es in WCF erwarten kann, und ich vermute, dass es möglicherweise etwas mit Folgendem zu tun hat:

AppDomain.CurrentDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal);

var identity = new WindowsIdentity("ksarfo");
var principal = new WindowsPrincipal(identity);
Console.WriteLine("\nChecking whether current user [" + identity.Name + "] is member of [" + groupName + "]");
Console.WriteLine(principal.IsInRole(groupName)); // returns true

principal = (WindowsPrincipal)Thread.CurrentPrincipal;
identity = (WindowsIdentity) principal.Identity;
Console.WriteLine("\nChecking whether current user [" + identity.Name + "] is member of [" + groupName + "]");
Console.WriteLine(principal.IsInRole(groupName)); // returns false

Ich verstehe nicht, warum sich die Ergebnisse für den Funktionsaufruf unterscheiden:

principal.IsInRole(groupName)

Aus Vollständigkeit ist der Punkt, an dem der Code tatsächlich fehlschlägt, hier:

PrincipalPermission(SecurityAction.Demand, Role = "PortfolioManager")]

Hilfe geschätzt.

War es hilfreich?

Lösung

Vielleicht liegt es daran, dass dies nicht die gleichen Klassen ist.

Schauen Sie sich MSDN an:

Wenn es also unterschiedliche Klassen gibt, gibt es möglicherweise unterschiedliche Implementierungen.

BEARBEITEN :

Ich habe diesen Code ausprobiert:

public class InGroup
{
    public string Name { get; set; }
    public bool Current { get; set; }
    public bool Fixe { get; set; }
    public bool Thread { get; set; }
}

WindowsIdentity current = System.Security.Principal.WindowsIdentity.GetCurrent();
WindowsPrincipal principalcurrent = new WindowsPrincipal(current);

WindowsIdentity fixe = new WindowsIdentity("JW2031");
WindowsPrincipal principalFixe = new WindowsPrincipal(fixe);

IPrincipal principalThread = System.Threading.Thread.CurrentPrincipal;

List<InGroup> ingroups = new List<InGroup>();
foreach (IdentityReference item in current.Groups)
{
    IdentityReference reference = item.Translate(typeof(NTAccount));
    Console.WriteLine("{0}\t{1}\t{2}\t{3}",
        reference.Value,
        principalcurrent.IsInRole(reference.Value),
        principalFixe.IsInRole(reference.Value),
        principalThread.IsInRole(reference.Value));

    ingroups.Add(new InGroup()
    {
        Name = reference.Value,
        Current = principalcurrent.IsInRole(reference.Value),
        Fixe = principalFixe.IsInRole(reference.Value),
        Thread = principalThread.IsInRole(reference.Value)
    });
}
foreach (IdentityReference item in fixe.Groups)
{
    IdentityReference reference = item.Translate(typeof(NTAccount));
    if (ingroups.FindIndex(g => g.Name == reference.Value) == -1)
    {
        ingroups.Add(new InGroup()
        {
            Name = reference.Value,
            Current = principalcurrent.IsInRole(reference.Value),
            Fixe = principalFixe.IsInRole(reference.Value),
            Thread = principalThread.IsInRole(reference.Value)
        });
        Console.WriteLine("{0}\t{1}\t{2}\t{3}",
            reference.Value,
            principalcurrent.IsInRole(reference.Value),
            principalFixe.IsInRole(reference.Value),
            principalThread.IsInRole(reference.Value));
    }
}

Und hier ist das Ergebnis

Wie Sie sehen können, hatte ich nicht die gleichen Gruppen mit unterschiedlichen Arten. Also (weil ich Administrator meines lokalen Computers bin), denke ich, dass WindowsIdentity.getCurrent den Benutzer von der Anzeige und Windowsprincipal (WindowsIdentity ("") von der lokalen Maschine bringt.

In meinem WebApp habe ich die möglichst niedrigste Autorisierung (glaube ich). Aber ich habe keine Erklärungen für den ConsoleApp ...

Es sind nur Vermutungen, aber das ist kohärent.

Andere Tipps

Ich glaube, der Unterschied liegt zwischen dem angemeldeten Benutzer und dem Konto, das die App (Thread) ausgeführt hat. Diese werden nicht immer gleich sein.

Ich gebe zu, dass es eine ziemlich hässliche Problemumgehung ist, aber wenn alles andere fehlschlägt, könnten Sie ersetzen:

principal = (WindowsPrincipal)Thread.CurrentPrincipal;

mit so etwas wie

principal = new WindowsPrincipal(new WindowsIdentity(Thread.CurrentPrincipal.Identity.Name));

Wenn das nicht funktioniert, wird es wahrscheinlich zumindest lehrreich sein, zu zeigen, wo die Dinge schief gehen.

Aber ich kann mir nicht vorstellen, dass es scheitert, da es genau dasselbe tut (wo es relevant ist) wie die Zeile, die funktioniert hat: Ich nehme an Thread.CurrentPrincipal.Identity.Name ist "ksarfo".

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top