Я хочу проверить набор учетных данных для контроллера домена. например:.
Username: STACKOVERFLOW\joel
Password: splotchy
Способ 1. Запрос Active Directory с олицетворением
Многие люди предлагают запросить Active Directory для чего-то. Если выбрано исключение, то вы знаете, что учетные данные недействительны - как это предлагается в qaru.site/info/15868/....
Есть некоторые серьезные недостатки этого подхода:
-
Вы не только аутентифицируете учетную запись домена, но также выполняете неявную проверку авторизации. То есть вы читаете свойства из AD, используя маркер олицетворения. Что делать, если в противном случае действительная учетная запись не имеет права читать из AD? По умолчанию все пользователи имеют доступ на чтение, но для политик домена можно отключить разрешения доступа для ограниченных учетных записей (или групп).
-
Привязка к AD имеет серьезные накладные расходы, кеш AD-схемы должен быть загружен на клиенте (кеш ADSI в поставщике ADSI, используемом DirectoryServices). Это как сетевой, так и серверы AD, потребляющие ресурсы - и слишком дороги для простой операции, такой как аутентификация учетной записи пользователя.
-
Вы полагаетесь на отказ исключения для случая, отличного от исключительных, и считаете, что это означает неправильное имя пользователя и пароль. Другие проблемы (например, сбой в сети, отказ подключения AD, ошибка выделения памяти и т.д.) Затем неправильно интерпретируются как сбой аутентификации.
Метод 2. LogonUser Win32 API
Другие предложили использовать функцию API LogonUser()
. Это звучит неплохо, но, к сожалению, вызывающему пользователю иногда требуется разрешение, обычно предоставляемое самой операционной системе:
Для вызова процесса LogonUser требуется привилегия SE_TCB_NAME. Если вызывающий процесс не имеет этого привилегии, LogonUser выходит из строя и GetLastError возвращает ERROR_PRIVILEGE_NOT_HELD.
В некоторых случаях, процесс, который вызывает LogonUser также должен иметь SE_CHANGE_NOTIFY_NAME привилегия включен; в противном случае LogonUser не работает и GetLastError возвращается ERROR_ACCESS_DENIED. Эта привилегия не требуется для локальной системы учетные записи или учетные записи, которые являются членами группы администраторов. От по умолчанию, SE_CHANGE_NOTIFY_NAME для всех пользователей, но некоторые администраторы могут отключить его для каждый.
Предоставление привилегии "Акт как часть операционной системы" - это не то, что вы хотите делать волей-неволей - как указывает Microsoft в статья базы знаний:
... процесс, вызывающий LogonUser должен иметь SE_TCB_NAME привилегии (в User Manager это "Закон как часть действующего Система" справа). SE_TCB_NAME привилегия очень сильна и не должны предоставляться произвольным пользователям, чтобы они могли запустите приложение, которое должно проверять учетные данные.
Кроме того, вызов LogonUser()
завершится с ошибкой, если указан пустой пароль.
Каков правильный способ аутентификации набора учетных данных домена?
Я звоню из управляемого кода, но это общий вопрос Windows. Можно предположить, что у клиентов установлен .NET Framework 2.0.