LDAP: код ошибки 49 - ошибка простого связывания: NT_STATUS_LOGON_FAILURE
Я пытаюсь аутентифицировать пользователя, но выкидывает Exception
. Может быть, есть проблема в конфигурации.
public class LdapApplication {
private static final String INITIAL_CONTEXT_FACTORY = "com.sun.jndi.ldap.LdapCtxFactory";
private static final String SECURITY_AUTHENTICATION ="simple";
private static final String NAMED_CONTEXT = "CN=Users";
private static final String SAM_ACCOUNT_NAME = "sAMAccountName=";
public static void main(String[] args) {
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY,INITIAL_CONTEXT_FACTORY);
env.put(Context.PROVIDER_URL, "ldap://ip:portNo/dc=organisation,dc=in");
env.put(Context.SECURITY_AUTHENTICATION, SECURITY_AUTHENTICATION);
env.put(Context.SECURITY_PRINCIPAL, "cn=userName,cn=Users");
env.put(Context.SECURITY_CREDENTIALS, "password" );
DirContext context = null;
NamingEnumeration namingEnumeration = null;
try {
context = new InitialDirContext(env);
namingEnumeration = context.search(NAMED_CONTEXT, SAM_ACCOUNT_NAME+ userName, null);
while (namingEnumeration.hasMore()) {
SearchResult searchResult = (SearchResult) namingEnumeration.next();
Attributes attributes = searchResult.getAttributes();
System.out.println(" Person Common Name = " + attributes.get("cn"));
System.out.println(" Person Display Name = " + attributes.get("displayName"));
}catch(Exception e){
System.out.println(e.getMessage());
e.printStackTrace();
}
}
} catch (Throwable e) {
e.printStackTrace();
} finally {
if (namingEnumeration != null) {
try {
namingEnumeration.close();
} catch (Exception e) {
}
}
if (context != null) {
try {
context.close();
} catch (Exception e) {
}
}
}
}
}
но если я упомяну Context.SECURITY_PRINCIPAL
как "organisation\\userName"
вместо "cn=userName,cn=Users"
это прекрасно работает. Пожалуйста, предложите возможное решение, потому что мое требование - дать SECURITY_PRINCIPAL что-то, используя cn или dc.
3 ответа
Вы используете относительное отличительное имя, которое не будет работать.
Измените свой код для использования
env.put(Context.SECURITY_PRINCIPAL, "cn=userName,cn=Users,dc=organisation,dc=in");
а также измените контекст поиска на:
private static final String NAMED_CONTEXT = "CN=Users,dc=organisation,dc=in";
Всегда используйте полные отличительные имена с LDAP.
У нас была та же проблема в нашем коде, и мы исправили ее, добавив доменное имя перед именем пользователя. Вместо входа user:password
, войти domain\user:password
,
Надеюсь это поможет.
Чтобы выполнить привязку LDAP, вам нужно будет использовать один из уникальных возвратов для одной из записей разрешения неоднозначных имен. Как правило, можно было бы использовать полностью различающееся имя.
У нас есть пример JNDI, показывающий, как это можно сделать.
-Джим