Как я могу проверить имя пользователя и пароль в Active Directory? Я просто хочу проверить правильность имени пользователя и пароля.
527
Как я могу проверить имя пользователя и пароль в Active Directory? Я просто хочу проверить правильность имени пользователя и пароля.
Если вы работаете в .NET 3.5 или новее, вы можете использовать System.DirectoryServices.AccountManagement
пространство имен и легко проверить свои учетные данные:
// create a "principal context" - e.g. your domain (could be machine, too)
using(PrincipalContext pc = new PrincipalContext(ContextType.Domain, "YOURDOMAIN"))
{
// validate the credentials
bool isValid = pc.ValidateCredentials("myuser", "mypassword");
}
Это просто, это надежно, это 100% C # управляемый код с вашей стороны - что еще вы можете попросить? :-)
Прочтите все об этом здесь:
Обновить:
Как указано в этом другом вопросе SO (и его ответах) , существует проблема с этим вызовом, который может возвращаться True
для старых паролей пользователя. Просто помните об этом и не удивляйтесь, если это произойдет :-) (спасибо @MikeGledhill за это!)
UserPrinciple.FindByIdentity
чтобы узнать, существует ли переданный идентификатор пользователя первым.ContextOptions.Negotiate
.Мы делаем это в нашей интранете
Вы должны использовать System.DirectoryServices;
Вот кишки кода
источник
strPassword
хранится в LDAP в виде простого текста?Close()
наusing
переменном.В некоторых решениях, представленных здесь, отсутствует возможность различать неправильный пользователь / пароль и пароль, который необходимо изменить. Это можно сделать следующим образом:
Если пароль пользователя неверен или пользователь не существует, ошибка будет содержать
«8009030C: LdapErr: DSID-0C0904DC, комментарий: ошибка AcceptSecurityContext, данные 52e, v1db1»,
если необходимо изменить пароль пользователя, он будет содержать
«8009030C: LdapErr: DSID-0C0904DC, комментарий: ошибка AcceptSecurityContext, данные 773, v1db1»
Значение
lexc.ServerErrorMessage
данных представляет собой шестнадцатеричное представление кода ошибки Win32. Это те же самые коды ошибок, которые были бы возвращены, в противном случае вызывая вызов Win32 LogonUser API. Список ниже суммирует диапазон общих значений с шестнадцатеричными и десятичными значениями:источник
System.DirectoryServices
иSystem.DirectoryServices.Protocols
очень простое решение с использованием DirectoryServices:
доступ к NativeObject необходим для обнаружения неверного пользователя / пароля
источник
PrincipleContext
- который существует только в .NET 3.5. Но если вы используете .NET 3.5 или новее, вы должны использоватьPrincipleContext
К сожалению, не существует «простого» способа проверить учетные данные пользователей в AD.
С каждым представленным методом вы можете получить ложноотрицательный результат: кредиты пользователя будут действительны, однако AD вернет ложь при определенных обстоятельствах:
ActiveDirectory не позволит вам использовать LDAP для определения того, является ли пароль недействительным из-за того, что пользователь должен сменить пароль или срок его действия истек.
Чтобы определить изменение пароля или срок его действия истек, вы можете вызвать Win32: LogonUser () и проверить код ошибки Windows на наличие следующих 2 констант:
источник
Вероятно, самый простой способ это PInvoke LogonUser Win32 API.eg
Ссылка MSDN здесь ...
Определенно хотите использовать тип входа
Это создает только легкий токен - идеально подходит для проверок AuthN. (другие типы могут использоваться для создания интерактивных сессий и т. д.)
источник
LogonUser
API требует от пользователя иметь Действовать как часть операционной системы privelage; это не то, что получают пользователи - и не то, что вы хотите предоставить каждому пользователю в организации. ( msdn.microsoft.com/en-us/library/aa378184(v=vs.85).aspx )Полное решение .Net заключается в использовании классов из пространства имен System.DirectoryServices. Они позволяют запрашивать сервер AD напрямую. Вот небольшой пример, который бы сделал это:
Этот код напрямую подключается к серверу AD, используя предоставленные учетные данные. Если учетные данные недействительны, searcher.FindOne () сгенерирует исключение. ErrorCode - это код, соответствующий ошибке COM «неверное имя пользователя / пароль».
Вам не нужно запускать код как пользователь AD. На самом деле, я успешно использую его для запроса информации на сервере AD от клиента за пределами домена!
источник
Еще один вызов .NET для быстрой аутентификации учетных данных LDAP:
источник
Попробуйте этот код (ПРИМЕЧАНИЕ. Сообщается, что он не работает на Windows Server 2000)
за исключением того, что вам нужно создать собственное исключение для "LogonException"
источник
Если вы застряли с .NET 2.0 и управляемым кодом, вот еще один способ, который работает с локальными и доменными учетными записями:
источник
Проверка подлинности Windows может быть неудачной по разным причинам: неверное имя пользователя или пароль, заблокированная учетная запись, пароль с истекшим сроком действия и многое другое. Чтобы различать эти ошибки, вызовите функцию LogonUser API через P / Invoke и проверьте код ошибки, если функция возвращает
false
:Пример использования:
Примечание. LogonUser требует доверительных отношений с доменом, с которым вы проверяете.
источник
Моя простая функция
источник
Вот мое полное решение для аутентификации для вашей справки.
Сначала добавьте следующие четыре ссылки
источник