2017-02-13 17 views
1


    В моем приложении я использую механизм проверки подлинности связывания LDAP. Я обычно получаю AuthenticationException, даже если какой-либо из них несоответствует (имя пользователя или пароль).
    Я хочу показать сообщение об ошибке или имя пользователя несоответствие или несоответствие пароля. В настоящее время использование AuthenticationException не позволяет получить правильные данные.LDAP/AD - как определить, является ли имя пользователя или пароль несоответствием

Есть ли какой-нибудь существующий API? или нужно запросить использование API?

Спасибо заранее.

ответ

0

Если пользователи дают имя пользователя и пароль для аутентификации, лучше всего не указывать им точную причину, по которой вход в систему не был успешным. Вы всегда говорите им, что существует несоответствие между именем пользователя и паролем, поэтому злоумышленник не узнает, существует ли конкретное имя пользователя.

+0

Я не показываю, какой из них неправилен в пользовательском интерфейсе, но мой код должен понять, какой из них не соответствует ни имени пользователя, ни паролю. –

0

Я согласен с тем, что наилучшая практика заключается не в том, чтобы объяснить причину.

-

Но если у вас есть, чтобы сделать это независимо от того, что:

Сделайте search с Логина, чтобы проверить, Имя пользователя существует. Если он не существует, это ошибка.

Если пользователь существует и продолжает аутентифицироваться, но вы получаете AuthenticationException, то это неправильный пароль.

-

Edit:

If(checkUserExists(username)){ 
    //construct the hashtable environment 
    //... 
    ht.put(Context.SECURITY_PRINCIPAL, username); 
    ht.put(Context.SECURITY_PRINCIPAL, password); 
    //... 
    try { 
     localLdapContent = new InitialLdapContext(ht, null); 
    } catch (Exception e) { 
     //suppose it's a wrong password 
    } 
}else{ 
    //error user doesn't exist 
} 

Вам нужно другое соединение LDAP с разрешения для проверки пользователя для всех запросов.

boolean checkUserExists(String username) { 
    //... 
    ht_administrator.put(Context.SECURITY_PRINCIPAL, admin_username); 
    ht_administrator.put(Context.SECURITY_PRINCIPAL, admin_password); 
    //... 
    adminconn = new InitialLdapContext(ht_administrator, null); 
    return adminconn.search(
     "uid="+username+",ou=people,dc=example,dc=com", "(objectclass=*)", searchControls 
    ).hasMore(); 
} 
+0

Можете ли вы поделиться кодом Java для своих комментариев? –

+0

У меня нет глобального контекста. Является ли способ запросить идентификатор пользователя, существует или нет, не предоставляя пароль (дрожание сервера ldap)? –

+0

Вы можете просто создать экземпляр 'new InitialLdapContext' с именем пользователя и паролем администратора для выполнения поиска. – cshu

0

returned error codes из Microsoft Active Directory предоставляет эту информацию.

Исключение составляет [LDAP: код ошибки 49 - 80090308: LdapErr: DSID-0Cxxxxxx, комментарий: AcceptSecurityContext error, data, vece]. "

Значения данных будут информировать об этой проблеме.

+0

Как для имени пользователя, так и для пароля, я получаю такое же сообщение об ошибке «javax.naming.AuthenticationException: [LDAP: код ошибки 49 - 80090308: LdapErr: DSID-0C090334, комментарий: AcceptSecurityContext error, data 52e, vece " –

+0

Is существует ли способ запросить идентификатор пользователя, существует или нет, без предоставления пароля (дрожание сервера ldap)? –