IPrincipal.IsInRole () работает только когда я усекаю имена ролей - почему? - PullRequest
6 голосов
/ 23 сентября 2010

У меня есть приложение, которое сильно зависит от авторизации пользователей.В нем я использую IPrincipal.IsInRole(), чтобы проверить, находятся ли пользователи в правильных группах:

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

В большинстве случаев это работает нормально, но не работает (возвращает неверный результат), если участник является экземпляромWindowsPrincipal.Я обнаружил, что для правильной работы я должен усечь имя роли, которую я передаю, до 32 символов (включая имя домена и \):

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

Усечениеимя роли тогда работает правильно.Зачем?Это ошибка / особенность / задокументированная проблема?У меня есть подозрение, что это может быть связано с доменами Win2000, но я не могу найти какую-либо информацию о нем.

Некоторая дополнительная информация:
Это проблема, потому что приложение может быть настроено на использование либоактивный каталог или «custom» для его авторизации («custom» - любой поставщик авторизации, который поддерживает интерфейс - может быть на основе SQL, на основе файлов и т. д.).Когда настраивается custom, роли, скорее всего, не нужно усекать, и поэтому я не хочу иметь дело с этим особым случаем в моем коде.Кроме того, у меня есть другая часть приложения, которая использует классы в пространстве имен System.DirectoryServices.AccountManagement для поиска членства в группах.Это требует полного имени роли и не работает, если они усечены.

1 Ответ

8 голосов
/ 23 сентября 2010

После долгих проб и ошибок я выяснил, что происходит.

Когда группа создается в Active Directory, ей присваиваются два имени:

alt text

Кажется, что WindowsPrincipal использует имя группы, предшествующее Windows 2000 , когда вызывается IsInRole.

После тщательного поиска это, похоже, нигде не задокументировано. Самый близкий, который я получил, был этот умозрительный ответ на подобный вопрос здесь на SO.


В моем случае группы, к которым я обращался в домене, имели длинное имя, но усеченное имя до Windows 2000 (по какой-то причине урезанное до 32 символов). Передача длинного имени не работает, так как он проверял неверное имя группы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...