Аутентификация в Active Directory 2016 из Java (веб-приложения) - PullRequest
0 голосов
/ 03 января 2019

Я установил установку AD 2016.Теперь намереваемся использовать его для аутентификации веб-приложений (java).У меня есть кусок кода для тестирования аутентификации и есть некоторые наблюдения.

public static void main(String[] args) 
{  
    String userid="userhere",password="passwordhere";
    LdapContextCreation ldapContxCrtn = new LdapContextCreation();  
    LdapContext ctx = ldapContxCrtn.getLdapContext(userid,password);
    if(ctx==null)
    {System.out.println("Authentication Failed.");}
    else
    {System.out.println("Authentication Successful.");} 
    }  
    public LdapContext getLdapContext(String base, String password)
    {  
        LdapContext ctx = null;  
        try
    { 
            Hashtable<String, String> env = new Hashtable<String, String>();
            env.put(Context.INITIAL_CONTEXT_FACTORY,  "com.sun.jndi.ldap.LdapCtxFactory");  
            env.put(Context.SECURITY_AUTHENTICATION, "Simple");
            env.put(Context.SECURITY_PRINCIPAL, base);
            env.put(Context.SECURITY_CREDENTIALS, password);
            env.put(Context.PROVIDER_URL, "ldaps://mydomaincontroller:636");
            ctx = new InitialLdapContext(env, null);  
     }
    catch(NamingException nex)
    {  
            //nex.printStackTrace();  
    }

Теперь я протестировал комбинацию пользователь / пароль в следующих сценариях -

// Первая комбинация, user1 существует вAD и пароль верны (проверка подлинности привязки).Строка userid = "user1@domain.com", пароль = "user1password";Ожидаемый: аутентификация успешна.Факт: аутентификация успешна.Это ясно для меня.Если пароль неверный, он отвечает правильным сообщением - Authentication Failed.

// Вторая комбинация, user2 существует в AD, но пароль, который мы пытаемся отправить, пуст (тестирование связывания без аутентификации) String userid = "user2@domain.com», пароль = "";Ожидается: ошибка аутентификации.Факт: аутентификация успешна.Как справиться с этим сценарием - Могу ли я управлять этим в AD или должен обрабатываться в коде?

// Третье сочетание, user3 НЕ существует в AD (тестирование для несуществующего пользователя) String userid = "user3 @domain.com», пароль = "somepassword";Ожидается: ошибка аутентификации.Факт: аутентификация успешна.Как справиться с этим сценарием?Пользователь даже не существует.Это неправильная конфигурация AD?

// Четвертая комбинация, пустое имя пользователя и пароль (проверка на анонимное связывание) String userid = "", password = "";Ожидается: ошибка аутентификации.Факт: аутентификация успешна.Как справиться с этим сценарием - Могу ли я управлять этим в AD или должен быть обработан в коде?

1 Ответ

0 голосов
/ 06 января 2019

То, что вы видите, - это «неаутентифицированная привязка», подробно описанная в LDAP RFC 4513, раздел 5.1.2 с примечанием относительно последующих соображений безопасности в , раздел 6.3.1 .

Лучше всего обработать это в коде (т. Е. Убедиться, что имя пользователя и пароль не равны NULL, прежде чем связываться с сервером каталогов). В Windows 2019 был добавлен параметр для запрета операций связывания без проверки подлинности - в разделе конфигурации откройте свойства CN=Directory Service, CN=Windows NT, CN=Services, CN=Configuration - найдите атрибут msDS-Other-Settings и добавьте новую запись DenyUnauthenticatedBind=1, но если вы не пишете Одноразовое приложение, которое будет использоваться только с вашей Active Directory, не является безопасным допущением, что другие Active Directory были настроены таким образом.

...