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