Domanda

Sto cercando di capire il motivo per cui la sicurezza basata attributo non funziona come mi aspetto in WCF e ho il sospetto che potrebbe avere qualcosa a che fare con il seguente:

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

Non capisco il motivo per cui i risultati si differenziano per la chiamata di funzione:

principal.IsInRole(groupName)

Per ragioni di completezza del punto in cui il codice non riesce in realtà è qui:

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

Guida apprezzato.

È stato utile?

Soluzione

Forse è perché questo non è le stesse classi.

Guardate MSDN:

Quindi, se ci sono classi differenti, forse ci sono differenti implementazioni.

EDIT:

Ho provare questo codice:

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

E qui è il risultato

Come si può vedere, non ho avuto gli stessi gruppi con differenti modi. Così (perché io sono amministratore della mia macchina locale) Credo che WindowsIdentity.GetCurrent otterrà l'utente da AD e WindowsPrincipal (WindowsIdentity ( "")) otterrà l'utente dal computer locale.

Nel mio webapp, ho avuto il più basso possibile, l'autorizzazione (credo). Ma, non ho spiegazioni per la ConsoleApp ...

E 'solo supposizioni, ma questo è coerente.

Altri suggerimenti

Credo che la differenza è tra l'utente collegato e l'account che esegue l'applicazione (filo). Questi non saranno sempre gli stessi.

Ammetto che è una soluzione piuttosto brutto, ma se tutto il resto fallisce si potrebbe sostituire:

principal = (WindowsPrincipal)Thread.CurrentPrincipal;

con qualcosa di simile

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

Se questo non funziona, sarà probabilmente almeno essere istruttivo nel mostrare dove le cose stanno andando male.

Ma non posso immaginare che in mancanza, dal momento che fa esattamente la stessa cosa (dove è rilevante) come la linea che funzionava:. Presumo Thread.CurrentPrincipal.Identity.Name è "ksarfo"

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top