java - ldap 连接错误,获取详细子错误代码

标签 java ldap

如果用户一切正常,那么这种连接似乎可以工作

Properties props = new Properties();
props.setProperty(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
props.setProperty(Context.PROVIDER_URL, someUrl);
props.setProperty(Context.SECURITY_PRINCIPAL, commonName);
props.setProperty(Context.SECURITY_CREDENTIALS, password);

InitialLdapContext ctx = null;
try {
    ctx = new InitialLdapContext(props, null);
    return true;
} catch (javax.naming.AuthenticationException ex) {
    ex.printStackTrace();
} catch (NamingException ex) {
     logger.warn("LDAP NamingException looking for user - " + 
          username + ": " + ex.getMessage(), ex);
}
return false;

但是如果用户无效,我们只会收到如下错误: javax.naming.AuthenticationException:LDAP:错误代码 49 这并不能区分无效通行证与过期帐户等之间的区别。

我读到您可以尝试重新连接,然后执行 getResponseControls() 来访问实际发生的详细错误,例如:

Properties props = new Properties();
props.setProperty(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
props.setProperty(Context.PROVIDER_URL, someUrl);

InitialLdapContext ctx = null;
try {
    ctx = new InitialLdapContext(props, null);
    // set the user/pass they entered
    ctx.addToEnvironment(Context.SECURITY_PRINCIPAL, commonName);
    ctx.addToEnvironment(Context.SECURITY_CREDENTIALS, password);
    Hashtable env = new Hashtable();
    ctx.reconnect(null);
    return true;
} catch (javax.naming.AuthenticationException ex) {
    ex.printStackTrace();
    try {
       Control[] controls = ctx.getResponseControls();
       if (controls == null) {
          logger.debug("response controls  = null", ex);
       } else {
           logger.debug("response controls  = " + controls.toString(), ex);
       }
   } catch (NamingException ex1) {
       logger.error("error decoding respponsecontrols", ex);
   }
   return false;
} catch (NamingException ex) {
     logger.warn("LDAP NamingException looking for user - " + 
          username + ": " + ex.getMessage(), ex);
}

但是当我这样做时,控件为空。

有人成功完成此操作吗?

最佳答案

许多目录服务器使用“无效凭据”(49) 来指示帐户存在问题,即帐户不存在或身份验证存在问题。一般来说,最好不要表明帐户不存在或被锁定(这也表明帐户存在),因为这样攻击者就会知道该帐户存在。

关于java - ldap 连接错误,获取详细子错误代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15871872/

相关文章:

java - 想念什么,连接 Firestore 和 ListView 以获得样本中的随机结果?

java - 如何获取用户在相关微调器上选择的数据?

Oracle Apex 5 LDAP 搜索不适用于全局目录

c - 使用 C 访问 Active Directory

java - 如何从 Ldap 中的给定组中提取所有成员的电子邮件地址

java - 如何在 JSF 页面中包含 servlet

java - JDBC中使用命名参数时是否有非法字符?

ldap - Phpldapadmin因未知原因无法正常工作

encryption - LDAP 可以在身份验证过程中识别密码哈希吗?

java - 在 Glassfish 4 上启动小程序