2010-09-23 11 views
5

Ho un'applicazione che fa molto affidamento sull'autorizzazione degli utenti. All'interno di esso, sto usando IPrincipal.IsInRole() per verificare se gli utenti sono nei gruppi corretti:IPrincipal.IsInRole() funziona solo quando ho troncato i nomi dei ruoli - perché?

IPrincipal principal = Thread.CurrentPrincipal; 
bool inRole = principal.IsInRole("mydomainname\some role with a long name"); 

Questo funziona bene per la maggior parte, ma non riesce (restituisce un risultato errato) se il principale è un esempio di un WindowsPrincipal. Ho scoperto che per farlo funzionare correttamente, devo troncare il nome del ruolo che mi passa per essere lungo 32 caratteri (compreso il nome di dominio e la \):

IPrincipal principal = Thread.CurrentPrincipal; // <- returns a WindowsPrincipal 
bool inRole = principal.IsInRole("mydomainname\some role with a lo"); 

troncamento il nome del ruolo poi funziona correttamente Perché? Si tratta di un bug/funzionalità/problema documentato? Ho il sospetto che potrebbe essere correlato ai domini Win2000, ma non riesce a trovare alcuna informazione su di esso.

qualche informazione in più:
Questo è un problema perché l'applicazione può essere configurato per utilizzare Active Directory o "su misura" per la sua autorizzazione ("custom" essere qualsiasi provider di autorizzazione che supporta un'interfaccia - potrebbe essere SQL -basato, basato su file, ecc.). Quando è configurata la personalizzazione, i ruoli probabilmente non hanno bisogno di troncamenti e quindi non voglio dover gestire questo caso speciale nel mio codice. Inoltre, ho un'altra parte dell'applicazione che utilizza le classi nello spazio dei nomi System.DirectoryServices.AccountManagement per cercare l'appartenenza ai gruppi. Ciò richiede il nome completo del ruolo e non funziona se sono troncati.

+4

Qualcuno una volta ha pensato: "32 caratteri sono sufficienti per qualsiasi ruolo" –

+0

@Henk: Mi piace :) I caratteri 32 lo rendono piuttosto difficile da cercare dato che ottieni molti hit per 'Int32',' Win32' , eccetera... – adrianbanks

risposta

7

Dopo molte prove ed errori, ho capito cosa sta succedendo.

Quando un gruppo viene creato in Active Directory, si è dato due nomi:

alt text

Sembra essere che WindowsPrincipal utilizza il nome del gruppo precedente a Windows 2000 quando IsInRole si chiama.

Dopo una ricerca approfondita, questo non sembra essere documentato da nessuna parte. Il più vicino che ho ottenuto è stato this speculative answer per una domanda simile qui su SO.


Nel mio caso, i gruppi sono stato l'interrogazione contro il dominio aveva un nome lungo, ma un tronco nome precedente a Windows 2000 (troncato a 32 caratteri per qualche motivo). Passare il nome lungo non funziona come si stava verificando con il nome del gruppo sbagliato.