2010-09-23 6 views
5

Mam aplikację, która opiera się głównie na autoryzacji użytkowników. W nim, używam IPrincipal.IsInRole() aby sprawdzić, czy użytkownicy są w odpowiednich grupach:IPrincipal.IsInRole() działa tylko po obcięciu nazw ról - dlaczego?

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

Działa to dobrze dla większości, ale nie powiedzie się (zwraca błędny wynik) gdy zleceniodawca jest instancją WindowsPrincipal. I odkryli, że aby to działało poprawnie, trzeba obciąć nazwę roli, jaką mam przepustkę być długie 32 znaków (łącznie z nazwą domeny i \):

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

obcinania nazwę roli następnie działa poprawnie. Czemu? Czy jest to błąd/funkcja/udokumentowany problem? Mam podejrzenie, że może to być związane z domenami Win2000, ale nie można znaleźć żadnych informacji na ten temat.

Niektóre dodatkowa informacja:
Jest to problem, ponieważ aplikacja może być skonfigurowany tak, aby użyć Active Directory lub „Custom” za jego zgodą („niestandardowym” bycia dowolnego dostawcy autoryzacji, który obsługuje interfejs - może być SQL oparte na plikach, itp.). Po skonfigurowaniu niestandardowego ról najprawdopodobniej nie trzeba przycinać, więc nie chcę zajmować się tym specjalnym przypadkiem w moim kodzie. Dodatkowo mam inną część aplikacji, która używa klas w przestrzeni nazw System.DirectoryServices.AccountManagement do wyszukiwania członkostwa grup. Wymaga to podania pełnej nazwy roli i nie działa, jeśli są one obcięte.

+4

Ktoś kiedyś pomyślał: "32 znaki są wystarczające dla każdej roli" –

+0

@Henk: Podoba mi się :) Postacie o wartości 32 sprawiają, że wyszukiwanie jest dość trudne, ponieważ dostajesz dużo trafień dla 'Int32',' Win32' , itp ... – adrianbanks

Odpowiedz

7

Po wielu próbach i błędach zorientowałem się, co się dzieje.

Po utworzeniu grupy w Active Directory, to otrzymuje dwie nazwy:

alt text

Wydaje się, że WindowsPrincipal używa nazwy grupy pre-Windows 2000 gdy IsInRole jest tzw.

Po dokładnym przeszukiwaniu wydaje się, że nie jest to dokumentacja nigdzie indziej. Najbliższe mi było this speculative answer podobne pytanie tutaj na SO.


W moim przypadku grupy I została odpytywanie na domenie przed sobą długą nazwę, ale obcięty pre-Windows 2000 nazwa (obcięte do 32 znaków z jakiegoś powodu). Przekazywanie długich nazw nie działa tak, jak sprawdzanie pod niewłaściwą nazwą grupy.

Powiązane problemy