Dando per scontato il nostro skill sul funzionamento delle identità nel mondo Microsoft .NET Framework, andremmo ora a coprire l'importantissimo argomento dell'interfaccia IPrincipal.

Formata da due membri:

  • Identity: una proprietà Read-Only legata alla Principal
  • IsInRole:  un metodo che informa se Principal appartiene ad uno specificato gruppo.

.NET espone due implementazioni di IPrincipal: GenericPrincipal e WindowsPrincipal, e proprio di queste andremmo a parlare.

GenericPrincipal è l'implementazione più semplice di IPrincipal. Per crearne una è necessario sottoporre un oggetto basato su una interfaccia IIdentity accompagnato da una lista di ruoli alla quale essa appartiene. Per esempio..

string[] roles = {"administrators", "developers"}; IIdentity soloNome = new GenericIdentity("amarziali"); GenericPrincipal genericPrincipal = new GenericPrincipal(soloNome, roles); Console.WriteLine(genericPrincipal.IsInRole("developers")); Console.WriteLine(genericPrincipal.IsInRole("accountants"));

In questo caso il risultato conseguente alla compilazione del progetto sarà

True
False

WindowsPrincipal è piuttosto simile a GenericPrincipal ad eccezione del suo costruttore. Infatti, tutto quello di cui ha bisogno è una WindowsIdentity come di seguito dimostrato.

WindowsPrincipal winPrincipal = new WindowsPrincipal(WindowsIdentity.GetCurrent()); Console.WriteLine(winPrincipal.IsInRole(@"MARTE\Administrators"));

Dato MARTE come nome della mia macchina, e che l'utente con cui lavoro in questo momento appartiene al gruppo degli utenti Administrators quale si pensi sia il risultato? False

No non ho commesso uno errore. Ci si potrebbe stupire dal ricevere false da questa parte di codice, specialmente se non si ha una buona conoscenza relativa al funzionamento della sicurezza degli ambienti Windows. Se si vuole utilizzare IsInRole nella sua forma principale, e, se si vuole ricevere il valore corretto bisogna utilizzare la stringa BUILTIN al posto del nome macchina (MARTE BUILTIN).

Questo perchè BUILTIN rappresenta un dominio presente in qualsiasi Windows box, anche nella vostra. Infatti, andando a modificare il codice in questo modo si riceve true.

Console.WriteLine(winPrincipal.IsInRole(@"BUILTIN\Administrators"));

Per ovviare a questo possibile problema è possibile ricorrere ad uno degli overload di InInRole() di WindowsPrincipal. In questo overload è possibile specificare, tramite un enumeratore, i seguenti ruoli standard di Windows:

  • AccountOperator
  • Administrator
  • BackupOperator
  • Guest
  • PowerUser
  • PrintOperator
  • Replicator
  • SystemOperator
  • User

In questo modo è possibile ricevere true andando semplicemente a modificare il precendente snippet di codice così

Console.WriteLine( winPrincipal.IsInRole(WindowsBuiltInRole.Administrator));

Oppure

Console.WriteLine(winPrincipal.IsInRole(0x00000220));

Dato che il valore 0x00000220 è il valore RID di WindowsBuiltInRole.Administrator