очень простое решение с использованием DirectoryServices:
using System.DirectoryServices;
//srvr = ldap server, e.g. LDAP://domain.com
//usr = user name
//pwd = user password
public bool IsAuthenticated(string srvr, string usr, string pwd)
{
bool authenticated = false;
try
{
DirectoryEntry entry = new DirectoryEntry(srvr, usr, pwd);
object nativeObject = entry.NativeObject;
authenticated = true;
}
catch (DirectoryServicesCOMException cex)
{
//not authenticated; reason why is in cex
}
catch (Exception ex)
{
//not authenticated due to some other exception [this is optional]
}
return authenticated;
}
для обнаружения плохих пользователей/паролей требуется доступ к NativeObject
Этот код плох, потому что он также выполняет проверку авторизации (проверьте, разрешено ли пользователю читать информацию активного каталога). Имя пользователя и пароль могут быть действительными, но пользователю не разрешено читать информацию - и получить исключение. Другими словами, вы можете иметь действительное имя пользователя и пароль, но все равно получите исключение.
На самом деле я нахожусь в процессе запроса нативный эквивалент PrincipleContext - который существует только в .NET 3.5. Но если вы используете .NET 3.5 или новее, вы должны использовать PrincipleContext
К сожалению, нет простого способа проверить учетные данные пользователей в AD.
С каждым представленным до сих пор способом вы можете получить ложно-отрицательный: пользовательские creds будут действительны, однако AD при возврате false будет возвращать false:
Пользователь должен сменить пароль при следующем входе в систему.
Срок действия пароля пользователя истек.
ActiveDirectory не позволит вам использовать LDAP, чтобы определить, недействителен ли пароль из-за того, что пользователь должен сменить пароль или срок их пароля истек.
Чтобы определить изменение пароля или срок действия пароля истек, вы можете вызвать Win32: LogonUser() и проверить код ошибки Windows для следующих 2 констант:
ERROR_PASSWORD_MUST_CHANGE = 1907
ERROR_PASSWORD_EXPIRED = 1330
Вероятно, самым простым способом является PInvoke LogonUser Win32 API.e.g.
www.pinvoke.net/default.aspx/advapi32/LogonUser.html
Ссылка MSDN здесь...
msdn.microsoft.com/en-us/library/aa378184.aspx
Определенно хотите использовать тип входа
LOGON32_LOGON_NETWORK (3)
Это создает только легкий токен - идеально подходит для проверок AuthN. (другие типы могут использоваться для создания интерактивных сеансов и т.д.)
Лучший способ правильно аутентифицировать кого-либо - это использовать LogonUserAPI для записи @stephbu. Все остальные методы, описанные в этом посте, не будут работать на 100%. Однако, просто заметка, я считаю, что вы должны быть присоединены к домену, чтобы вызвать LogonUser.