Ich arbeite gerade an einem kleinen Projekt mit Active Directory und ein paar LDAP-Dateien ... Ich versuche, eine Verbindung zum LDAP-Server herzustellen, und es gibt immer den gleichen Fehler:
[LDAP: error code 49 - 80090308: LdapErr: DSID-0C0903A9, comment: AcceptSecurityContext error, data 52e, v1db1
Soweit ich weiß, bedeutet dies, dass die Anmeldeinformationen falsch sind, aber ich bin mir 100% sicher, dass sie Recht haben! Könnte es sein, dass ich einen Parameter vergessen habe?
Hashtable<String, String> env = new Hashtable<String, String>();
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.Sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL, "ldap://libertycity.ch:389/dc=libertycity,dc=ch");
env.put(Context.SECURITY_AUTHENTICATION, "simple");
env.put(Context.SECURITY_CREDENTIALS, password);
env.put(Context.SECURITY_PRINCIPAL, "uid=" + username + ",ou=Users");
env.put("Java.naming.ldap.attributes.binary", "objectSID");
DirContext ctx = new InitialDirContext(env);
Ich denke, mein Code sieht richtig aus oder habe ich etwas vermisst? Was könnte das Problem sein und wie kann ich das herausfinden?
Der im Fehler angegebene Wert "data 52e" impliziert, dass die Bindung fehlgeschlagen ist, weil: Gibt zurück, wenn Benutzername gültig ist, Kennwort/Berechtigungsnachweis jedoch ungültig ist.
http://ldapwiki.com/wiki/Common%20Active%20Directory%20Bind%20Errors
Dieses Problem kann auch auftreten, wenn die vollständige Domäne nicht im Benutzernamen enthalten ist.
Legen Sie den Sicherheitsprinzipal als [email protected]
fest.
InitialLdapContext ldapContext = new InitialLdapContext();
ldapContext.addToEnvironment(Context.INITIAL_CONTEXT_FACTORY, "com.Sun.jndi.ldap.LdapCtxFactory");
ldapContext.addToEnvironment(Context.SECURITY_AUTHENTICATION, "simple");
ldapContext.addToEnvironment(Context.SECURITY_PRINCIPAL, userId + "@mydomain.com");
ldapContext.addToEnvironment(Context.SECURITY_CREDENTIALS, password);
ldapContext.addToEnvironment(Context.PROVIDER_URL, "ldap://" + ldapHost + ":" + ldapPort);
Ich hatte die Probleme beim Versuch, eine Verbindung von wildfly zu einem Microsoft Active Directory-Server zu sichern. Das Hauptproblem besteht nicht darin, zu wissen, welche Verbindungszeichenfolge sein sollte.
Wenn Sie den "Active Directory Explorer" von Sysinternals installieren, nehmen Sie das Kit von Microsoft. Suchen Sie nach dem Objekt, an das Sie binden möchten. Die Einstellung 'Path:' wird angezeigt. Dies ist die Zeichenfolge von Werten, die Sie im Argument in den Context.SECURITY_PRINCIPAL-Wert angeben müssen. In meinem Fall hatte die Pfadzeichenfolge das Format
CN = Fred Blogs, OU = XXX Benutzer, DC = foo-bar, DC = com, xxx.foo-bar.com: 389 [xxx.foo-bar.com]]
Das erforderliche Argument wäre
"CN = Fred Blogs, OU = XXX Benutzer, DC = foo-bar, DC = com"
Bitte beachten Sie, dass Leerzeichen sehr wichtig sind
Der LDAP-Fehlercode 49 zeigt "Ungültige Anmeldeinformationen" an. Dies bedeutet, dass das an den LDAP-Server gesendete Kennwort nicht korrekt war.
Active Directory: Überprüfen Sie Ihre Domänencontainer.
Ich hatte den gleichen Fehler bei einer Migration von eDirectory zu Active Directory, der Benutzername und das Kennwort schienen richtig zu sein, aber aus irgendeinem Grund erhielt ich immer noch den Fehler "52e", der angibt, dass das Kennwort nicht korrekt ist.
Ich musste die DCs (Domain Container) zum Principal hinzufügen, damit es funktioniert:
Das hat nicht funktioniert:
env.put(Context.SECURITY_PRINCIPAL, "CN="+username+",OU=Users,OU=Org,OU=ETC");
Hinzufügen der DCs: (Das hat für mich funktioniert)
env.put(Context.SECURITY_PRINCIPAL, "CN="+username+",OU=Users,OU=Org,OU=ETC,DC=yourorg,DC=com");
Dies löste das Problem für Active Directory.
Etwas, das mir beim Lösen dieses Problems wirklich geholfen hat, war der Versuch, mithilfe des Linux-Befehls ldapbind/ldapsearch https://docs.Oracle.com/cd/B10501_01/network.920/a96579/comtools.htm eine Verbindung herzustellen.
wenn Sie das Betriebssystem mit den Befehlen ldapbind/ldapsearch zum Laufen bringen, wissen Sie genau, welche Parameter Sie in Ihrem Code verwenden sollten.
DirContext ldapContext;
Hashtable<String, String> ldapEnv = new Hashtable<String, String>(11);
ldapEnv.put(Context.INITIAL_CONTEXT_FACTORY, "com.Sun.jndi.ldap.LdapCtxFactory");
//ldapEnv.put(Context.PROVIDER_URL, "ldap://societe.fr:389");
ldapEnv.put(Context.PROVIDER_URL, "ldap://10.112.115.14:389");
ldapEnv.put(Context.SECURITY_AUTHENTICATION, "simple");
ldapEnv.put(Context.SECURITY_PRINCIPAL, "[email protected]");
ldapEnv.put(Context.SECURITY_CREDENTIALS, "ca$hc0w");
//ldapEnv.put(Context.SECURITY_PROTOCOL, "ssl");
//ldapEnv.put(Context.SECURITY_PROTOCOL, "simple");
ldapContext = new InitialDirContext(ldapEnv);
System.out.println(ldapContext);
// Create the search controls
SearchControls searchCtls = new SearchControls();
//Specify the attributes to return
String returnedAtts[]={"sn","givenName", "samAccountName", "mail"};
searchCtls.setReturningAttributes(returnedAtts);
//Specify the search scope
searchCtls.setSearchScope(SearchControls.SUBTREE_SCOPE);
//specify the LDAP search filter
String searchFilter = "(&(objectClass=user)(mail=*))";
//Specify the Base for the search
String searchBase = "DC=VIEWCONNECTION, DC=COM";
//initialize counter to total the results
int totalResults = 0;
// Search for objects using the filter
NamingEnumeration<SearchResult> answer = ldapContext.search(searchBase, searchFilter, searchCtls);
//Loop through the search results
while (answer.hasMoreElements())
{
SearchResult sr = (SearchResult)answer.next();
totalResults++;
System.out.println(">>>" + sr.getName());
Attributes attrs = sr.getAttributes();
System.out.println(">>>>>>" + attrs.get("samAccountName"));
}
System.out.println("Total results: " + totalResults);
ldapContext.close();