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.
Ktoś kiedyś pomyślał: "32 znaki są wystarczające dla każdej roli" –
@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