Проверить имя пользователя и пароль в Active Directory?

Он обтекает.

например:

тест публичного класса {

public static void main(String[] args) {
    int i = Integer.MAX_VALUE;
    int j = Integer.MIN_VALUE;

    System.out.println(i+1);
    System.out.println(j-1);

}

}

печатает

-2147483648

2147483647

502
задан Marc 5 November 2012 в 16:42
поделиться

7 ответов

Мы делаем это на нашей Интранет

, необходимо использовать Систему. DirectoryServices;

Вот кишки кода

using (DirectoryEntry adsEntry = new DirectoryEntry(path, strAccountId, strPassword))
{
    using (DirectorySearcher adsSearcher = new DirectorySearcher(adsEntry))
    {
        //adsSearcher.Filter = "(&(objectClass=user)(objectCategory=person))";
        adsSearcher.Filter = "(sAMAccountName=" + strAccountId + ")";

        try
        {
            SearchResult adsSearchResult = adsSearcher.FindOne();
            bSucceeded = true;

            strAuthenticatedBy = "Active Directory";
            strError = "User has been authenticated by Active Directory.";
        }
        catch (Exception ex)
        {
            // Failed to authenticate. Most likely it is caused by unknown user
            // id or bad strPassword.
            strError = ex.Message;
        }
        finally
        {
            adsEntry.Close();
        }
    }
}
68
ответ дан Community 5 November 2012 в 16:42
поделиться

использование очень простого решения 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 требуется, чтобы обнаруживать плохого пользователя/пароль

33
ответ дан Markus Safar 5 November 2012 в 16:42
поделиться

К сожалению, нет никакого "простого" способа проверить пользовательские учетные данные на AD.

С каждой методикой, представленной до сих пор, можно получить ложно-отрицательное: creds пользователя будет допустим, однако AD возвратит false при определенных обстоятельствах:

  • Пользователь обязан Пароль Изменения при Следующем Входе в систему.
  • пароль Пользователя истек.

ActiveDirectory не позволит Вам использовать LDAP, чтобы определить, недопустим ли пароль вследствие того, что пользователь должен изменить пароль или если их пароль истек.

Для определения изменения пароля или пароля истек, можно назвать Win32:LogonUser () и проверить код ошибки окон на следующие 2 константы:

  • ERROR_PASSWORD_MUST_CHANGE = 1907
  • ERROR_PASSWORD_EXPIRED = 1330
28
ответ дан Alan 5 November 2012 в 16:42
поделиться

Вероятно, самый легкий путь к Win32 API.e.g PInvoke LogonUser.

http://www.pinvoke.net/default.aspx/advapi32/LogonUser.html

Ссылка MSDN здесь...

http://msdn.microsoft.com/en-us/library/aa378184.aspx

Определенно хочет использовать тип

LOGON32_LOGON_NETWORK (3)

входа в систему, Это создает легкий маркер только - идеально подходящий для проверок AuthN. (другие типы могут использоваться для создания интерактивных сессий и т.д.)

21
ответ дан stephbu 5 November 2012 в 16:42
поделиться

Полное.Net решение состоит в том, чтобы использовать классы от Системы. Пространство имен DirectoryServices. Они позволяют запрашивать AD сервер непосредственно. Вот небольшая выборка, которая сделала бы это:

using (DirectoryEntry entry = new DirectoryEntry())
{
    entry.Username = "here goes the username you want to validate";
    entry.Password = "here goes the password";

    DirectorySearcher searcher = new DirectorySearcher(entry);

    searcher.Filter = "(objectclass=user)";

    try
    {
        searcher.FindOne();
    }
    catch (COMException ex)
    {
        if (ex.ErrorCode == -2147023570)
        {
            // Login or password is incorrect
        }
    }
}

// FindOne() didn't throw, the credentials are correct

Этот код непосредственно соединяется с AD сервером, с помощью обеспеченных учетных данных. Если учетные данные недопустимы, искатель. FindOne () выдаст исключение. ErrorCode является тем, соответствующим "неверному имени пользователя / пароль" ошибка COM.

Вы не должны выполнять код как AD пользователь. На самом деле я успешно использую его для запросов информации о AD сервере от клиента вне домена!

18
ответ дан Mathieu Garstecki 5 November 2012 в 16:42
поделиться

Попробуйте этот код (ПРИМЕЧАНИЕ: Сообщаемый не работать над Windows Server 2000)

#region NTLogonUser
#region Direct OS LogonUser Code
[DllImport( "advapi32.dll")]
private static extern bool LogonUser(String lpszUsername, 
    String lpszDomain, String lpszPassword, int dwLogonType, 
    int dwLogonProvider, out int phToken);

[DllImport("Kernel32.dll")]
private static extern int GetLastError();

public static bool LogOnXP(String sDomain, String sUser, String sPassword)
{
   int token1, ret;
   int attmpts = 0;

   bool LoggedOn = false;

   while (!LoggedOn && attmpts < 2)
   {
      LoggedOn= LogonUser(sUser, sDomain, sPassword, 3, 0, out token1);
      if (LoggedOn) return (true);
      else
      {
         switch (ret = GetLastError())
         {
            case (126): ; 
               if (attmpts++ > 2)
                  throw new LogonException(
                      "Specified module could not be found. error code: " + 
                      ret.ToString());
               break;

            case (1314): 
               throw new LogonException(
                  "Specified module could not be found. error code: " + 
                      ret.ToString());

            case (1326): 
               // edited out based on comment
               //  throw new LogonException(
               //   "Unknown user name or bad password.");
            return false;

            default: 
               throw new LogonException(
                  "Unexpected Logon Failure. Contact Administrator");
              }
          }
       }
   return(false);
}
#endregion Direct Logon Code
#endregion NTLogonUser

кроме необходимо будет создать собственное исключение для "LogonException"

10
ответ дан Charles Bretana 5 November 2012 в 16:42
поделиться

Если Вы работаете над.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# на Вашем конце - что больше можно попросить? :-)

Read все об этом здесь:

:

, Как обрисовано в общих чертах в это другой ТАК вопрос (и его ответы) , существует проблема с этим вызовом, возможно возвращаясь True для старых паролей пользователя. Просто знайте об этом поведении, и не слишком удивляйтесь, происходит ли это :-) (благодаря @MikeGledhill для указания на это!)

624
ответ дан Community 6 November 2012 в 03:42
поделиться
  • 1
    А-ч, я вижу. Свойства, объявленные как " key" not' t изменяемый - только те, которые являются not' t. I' m все еще уверенный, что было получено при помощи изменяемых свойств вместо полей для остальных. Участник должен быть свойством вместо поля, если класс или (возможно будущая) производная могли бы хотеть поведение не по умолчанию, но начиная с анонимного classes' изменяемые участники будут всегда использовать поведения по умолчанию I' m не очищают what' s полученный путем создания их свойствами. – supercat 31 January 2012 в 08:06
Другие вопросы по тегам:

Похожие вопросы: