2010-09-23 3 views
5

Ich habe eine Anwendung, die stark auf die Autorisierung von Benutzern beruht. Innerhalb es, ich bin mit IPrincipal.IsInRole() zu überprüfen, ob Benutzer in den richtigen Gruppen sind:IPrincipal.IsInRole() funktioniert nur, wenn ich die Rollennamen abschneide - warum?

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

Dies funktioniert gut für den größten Teil, aber nicht (gibt ein falsches Ergebnis), wenn der Auftraggeber eine Instanz eines WindowsPrincipal ist. Ich habe festgestellt, dass es richtig funktioniert, ich habe den Namen der Rolle abzuschneiden, die ich in Pass 32 Zeichen lang zu sein (einschließlich des Domänennamens und der \):

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

Kürzen den Rollennamen dann funktioniert richtig. Warum? Ist das ein Bug/Feature/dokumentiertes Problem? Ich habe eine Ahnung, dass es mit Win2000-Domains verwandt sein kann, kann aber keine Informationen darüber finden.

einige zusätzliche Informationen:
Dies ist ein Problem, weil die Anwendung konfiguriert werden kann, entweder Active Directory oder „custom“ für die Zulassung („custom“ ist jeder Autorisierungsanbieter zu verwenden, die eine Schnittstelle unterstützt - SQL sein könnte basierend, dateibasiert, etc ..). Wenn custom konfiguriert ist, müssen die Rollen höchstwahrscheinlich nicht abgeschnitten werden. Daher möchte ich diesen speziellen Fall in meinem Code nicht behandeln. Darüber hinaus habe ich einen anderen Teil der Anwendung, die Klassen im System.DirectoryServices.AccountManagement Namespace verwendet, um Gruppenmitgliedschaften nachzuschlagen. Dies erfordert den vollständigen Rollennamen und funktioniert nicht, wenn sie abgeschnitten werden.

+4

Jemand dachte einmal: "32 Zeichen sind genug für jede Rolle" –

+0

@Henk: Ich mag es :) Die Charaktere sind 32 macht es ziemlich schwer zu suchen, wie Sie viele Treffer für 'Int32',' Win32' bekommen , etc... – adrianbanks

Antwort

7

Nach viel Versuch und Irrtum habe ich herausgefunden, was vor sich geht.

alt text

Es scheint zu sein, dass Windows die Pre-Windows 2000 Gruppennamen verwendet, wenn IsInRole genannt wird:

Wenn eine Gruppe in Active Directory erstellt wird, wird es zwei Namen gegeben.

Nach ausführlicher Suche scheint dies nirgendwo dokumentiert zu sein. Der nächste, den ich bekam, war this speculative answer zu einer ähnlichen Frage hier auf SO.


In meinem Fall die Gruppen I gegen auf der Domain wurde Abfrage hatten einen langen Namen, aber ein verkürztes Pre-Windows 2000-Name (gekürzt aus irgendeinem Grunde zu 32 Zeichen). Das Übergeben des langen Namens funktioniert nicht, da es mit dem falschen Gruppennamen verglichen wurde.