現在、Active DirectoryといくつかのLDAPに関する小さなプロジェクトに取り組んでいます... LDAPサーバーに接続しようとすると、常に同じエラーが発生します。
[LDAP: error code 49 - 80090308: LdapErr: DSID-0C0903A9, comment: AcceptSecurityContext error, data 52e, v1db1
私が知っている限り、これは資格情報が間違っていることを意味しますが、100%正しいと確信しています!パラメータを忘れたのでしょうか?
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);
私のコードは正しいように見えると思いますか、それとも何かを見逃しましたか?何が問題であり、どのようにそれを見つけることができますか?
エラーで提供される値「data 52e」は、バインドが失敗したことを意味します。ユーザー名は有効であるが、パスワード/資格情報が無効である場合に返されます。
http://ldapwiki.com/wiki/Common%20Active%20Directory%20Bind%20Errors
この問題は、完全なドメインがユーザー名に含まれていない場合にも発生することがあります。
セキュリティプリンシパルをusername@domain
として設定します。
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);
WildflyからMicrosoft Active Directoryサーバーへの接続を保護しようとするときに問題が発生しました。主な問題は、接続文字列がどうあるべきかを知らないことです。
Sysinternalsの「Active Directory Explorer」をインストールした場合、Microsoftが提供するキットを取ります。バインドしたいオブジェクトを検索すると、「パス:」設定が表示されます。これは、Context.SECURITY_PRINCIPAL値の引数で引用する必要がある値の文字列です。私の場合、パス文字列は次の形式でした
CN =フレッドブログ、OU = XXXユーザー、DC = foo-bar、DC = com、xxx.foo-bar.com:389 [xxx.foo-bar.com]]
必要な引数は
"CN = Fred Blogs、OU = XXX Users、DC = foo-bar、DC = com"
スペースは非常に重要であることに注意してください
LDAPエラーコード49は「無効な資格情報」を示します。これは、LDAPサーバーに送信したパスワードが正しくなかったことを意味します。
Active Directory:ドメインコンテナを確認します。
EDirectoryからActive Directoryへの移行で同じエラーが発生しました。ユーザー名とパスワードは正しいようですが、何らかの理由で、パスワードが正しくないことを示す「52e」エラーが発生しました。
DC(ドメインコンテナー)をプリンシパルに追加して機能させる必要がありました。
これは機能していませんでした:
env.put(Context.SECURITY_PRINCIPAL, "CN="+username+",OU=Users,OU=Org,OU=ETC");
DCの追加:(これは私にとってはうまくいきました)
env.put(Context.SECURITY_PRINCIPAL, "CN="+username+",OU=Users,OU=Org,OU=ETC,DC=yourorg,DC=com");
これでActive Directoryの問題が解決しました。
この問題を解決するのに本当に役立つのは、linux ldapbind/ldapsearchコマンドを使用してバインドしようとした https://docs.Oracle.com/cd/B10501_01/network.920/a96579/comtools.htm 。
ldapbind/ldapsearchコマンドを使用してOSから機能させると、コードで使用する正確なパラメーターがわかります。
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();