Quelle est la différence entre la récupération WindowsPrincipal de WindowsIdentity et Thread.CurrentPrincipal?

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

Question

J'essaie de comprendre pourquoi la sécurité basée sur l'attribut ne fonctionne pas comme je pense à WCF et je pense qu'il pourrait avoir quelque chose à voir avec ce qui suit:

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

Je ne comprends pas pourquoi les résultats diffèrent pour l'appel de fonction:

principal.IsInRole(groupName)

Par souci d'exhaustivité du point où le code ne fait ici est:

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

Aide apprécié.

Était-ce utile?

La solution

Peut-être qu'il est parce que ce ne sont pas les mêmes classes.

Regardez MSDN:

Donc, s'il y a différents cours, peut-être il y a différents implémentations.

EDIT:

J'essayer ce code:

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

Et voici le résultat

Comme vous pouvez le voir, je n'ai pas eu les mêmes groupes avec différents moyens. Donc, (parce que je suis administrateur de ma machine locale) Je pense que WindowsIdentity.GetCurrent obtiendra l'utilisateur de AD et WindowsPrincipal (WindowsIdentity ( « »)) va obtenir l'utilisateur de la machine locale.

Dans mon webapp, j'ai obtenu l'autorisation le plus bas possible (je pense). Mais, je n'ai pas d'explications pour le ConsoleApp ...

Il est seulement des suppositions, mais cela est cohérent.

Autres conseils

Je crois que la différence entre l'utilisateur connecté et le compte en cours d'exécution de l'application (thread). Ceux-ci ne seront pas toujours les mêmes.

Je reconnais qu'il est une solution de contournement plutôt laid, mais si tout le reste échoue, vous pourrait remplacer:

principal = (WindowsPrincipal)Thread.CurrentPrincipal;

avec quelque chose comme

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

Si cela ne fonctionne pas, il sera probablement au moins instructif pour montrer où les choses vont mal.

Mais je ne peux pas imaginer à défaut, car il fait exactement la même chose (où il est pertinent) que la ligne qui a fonctionné. Je suppose que Thread.CurrentPrincipal.Identity.Name est "ksarfo"

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top