LDAP:エラーコード49-80090308:LdapErr:DSID-0C0903A9、コメント:AcceptSecurityContextエラー、データ52e、v1db1
「52e」コードは、ユーザー名は有効ですが、パスワードは無効です。 Apacheスタジオで同じユーザー名とパスワードを使用していますが、LDAPへの接続を正常に確立できました。
ここに私のJavaコード
String userName = "*******";
String password = "********";
String base ="DC=PSLTESTDOMAIN,DC=LOCAL";
String dn = "cn=" + userName + "," + base;
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY,"com.Sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL, "ldap://******");
env.put(Context.SECURITY_AUTHENTICATION, "simple");
env.put(Context.SECURITY_PRINCIPAL, dn);
env.put(Context.SECURITY_CREDENTIALS, password);
LDAPAuthenticationService ldap = new LDAPAuthenticationService();
// LdapContext ctx;
DirContext ctx = null;
try {
ctx = new InitialDirContext(env);
エラーはこの行にあります:ctx = new InitialDirContext(env);
このエラーの正確な原因はわかりません。
データ52e- ユーザー名は有効だがパスワード/資格情報が無効の場合に返される
おそらく次のようなものが必要です
String dn = "cn=" + userName + "," + "CN=Users," + base;
私にとって、このように主要なセクションを設定すると問題は解決しました:
env.put(Context.SECURITY_PRINCIPAL, userId@domainWithoutProtocolAndPortNo);
52e 1326 ERROR_LOGON_FAILUREユーザー名は有効だがパスワード/資格情報が無効な場合に返されます。他のほとんどのエラーが上記のように表示されないようにします。
http://ldapwiki.com/wiki/Common%20Active%20Directory%20Bind%20Errors
Context.SECURITY_AUTHENTICATIONを「シンプル」として使用する場合、userPrincipalName属性値(user @ domain_base)を指定する必要があります。
CASでADを使用するときに同様の問題が発生しました。つまり、52eエラーです。私の場合、アプリケーションは実際のユーザー名ではなくCN =の形式でフルネームを受け入れます。
たとえば、Ross Butlerというフルネームのユーザーがいて、ログインユーザー名がrbutlerの場合、通常はcn = rbutler、ou = Users、dc = domain、dc = comのように入力しますが、毎回失敗します。これをcn = Ross Butler、ou = Users、dc = domain、dc = comに変更することで合格しました!!
私の場合、ログインに成功するには@などを使用する必要があります。
sample_user @ sample_domain
私の場合、次のようにユーザー名にドメイン名を追加することで問題が解決します。
string userName="yourUserName";
string password="passowrd";
string hostName="LdapServerHostName";
string domain="yourDomain";
System.DirectoryServices.AuthenticationTypes option = System.DirectoryServices.AuthenticationTypes.SecureSocketsLayer;
string userNameWithDomain = string.Format("{0}@{1}",userName , domain);
DirectoryEntry directoryOU = new DirectoryEntry("LDAP://" + hostName, userNameWithDomain, password, option);
デバッグしてctx = nullを見ると、ユーザー名に問題がある可能性があります
LDAPは、トランザクションを別のサーバーDBに送信するときにADで認証しようとしています。このトランザクションは以前の資格情報を使用して生成されましたが、ユーザーが最近パスワードを変更したため、この認証は失敗します。この認証は、トランザクションのステータスを完了またはキャンセルに変更しない限り、...まで失敗し続けます。その場合、LDAPはこれらのトランザクションの送信を停止します。
私にとっては、次のようにenvを変更することで問題が解決します。
env.put("LDAP_BASEDN", base)
env.put(Context.SECURITY_PRINCIPAL,"user@domain")