What's the difference between retrieving WindowsPrincipal from WindowsIdentity and Thread.CurrentPrincipal?

前端 未结 3 1668
你的背包
你的背包 2021-02-05 10:12

I am trying to work out why attribute based security isn\'t working as I\'d expect in WCF and I suspect it might have something to do with the following:

AppDoma         


        
相关标签:
3条回答
  • 2021-02-05 10:41

    I believe the difference is between the logged in user and the account running the app (thread). These will not always be the same.

    0 讨论(0)
  • 2021-02-05 10:43

    I admit it's a rather ugly workaround, but if all else fails you could replace:

    principal = (WindowsPrincipal)Thread.CurrentPrincipal;
    

    with something like

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

    If that doesn't work, it will probably at least be instructive in showing where things are going wrong.

    But I can't imagine it failing, since it does exactly the same thing (where it is relevant) as the line that worked: I assume Thread.CurrentPrincipal.Identity.Name is "ksarfo".

    0 讨论(0)
  • 2021-02-05 10:45

    Maybe it's because this is not the same classes.

    Look at MSDN :

    • Thread.CurrentPrincipal
      • IPrincipal
        • IsInRole
    • WindowsPrincipal
      • IsInRole

    So, if there are differents classes, maybe there are differents implementations.

    EDIT :

    I have try this 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));
        }
    }
    

    And here is the result

    As you can see, I did not have the same groups with differents ways. So (because I'm administrator of my local machine) I think that WindowsIdentity.GetCurrent will get the user from AD and WindowsPrincipal(WindowsIdentity("")) will get the user from local machine.

    In my webapp, I have got the lowest authorisation possible (I think). But, I have no explanations for the consoleapp...

    It's only suppositions, but this is coherent.

    0 讨论(0)
提交回复
热议问题