У меня есть приложение, которое сильно зависит от авторизации пользователей.В нем я использую 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
для поиска членства в группах.Это требует полного имени роли и не работает, если они усечены.