【问题标题】:Active Directory LDAP authentication fail if username contains dots (.)如果用户名包含点 (.),则 Active Directory LDAP 身份验证失败
【发布时间】:2013-12-09 02:58:12
【问题描述】:

我用Java制作了一个Active Directory (winserver 2012) LDAP验证器,在这种情况下,当AD用户名包含dost(.)时,验证失败,除了这个例外:

javax.naming.AuthenticationException: [LDAP: error code 49 - 8009030C: LdapErr: DSID-0C0904F8, comment: AcceptSecurityContext error, data 52e, v23f0

如果用户名不包含点,则 auth.工作正常。

有代码:

private DirContext getDirContext(String username, String password) {

    ...

    Hashtable<String, String> env = new Hashtable<>();

    env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
    env.put(Context.SECURITY_AUTHENTICATION, "DIGEST-MD5");
    env.put(Context.PROVIDER_URL, "LDAP://server.test.local:389");
    env.put(Context.SECURITY_PRINCIPAL, "test.user");
    env.put(Context.SECURITY_CREDENTIALS, "password");
    env.put(Context.REFERRAL, "follow");
    env.put("java.naming.ldap.attributes.binary", "objectGUID objectSid");

    DirContext ctx;

    try {
        ctx = new InitialLdapContext(env, null);
    } catch (NamingException ex) {
        getLogger().log(Level.WARNING,
                "ACTIVE DIRECTORY - AUTHENTICATION ERROR: " + ex);
    }

    return ctx;
}

我尝试将点替换为 %2e,并尝试了完整的用户名 (test.user@test.local),但这些并没有解决我的问题。

有人知道吗?谢谢。

【问题讨论】:

  • 我认为你需要添加域(IE:DOMAIN\\+用户)见:stackoverflow.com/questions/16570222/…
  • 难道Context.SECURITY_PRINCIPAL 不需要断言,例如cn=test.user
  • 它可以在没有 cn= 的情况下工作,但我会用这个检查它,明天用 DOMAIN/ 进行检查。
  • 我尝试了以下用户名中不带点的类型:cn=testuser,ou=User,dc=test,dc=local - 不起作用,TEST\\testuser - 不起作用, userPrincipalName=testuser@test.local - 不起作用。所以我不知道为什么,但它现在可以工作以防万一,当我给“testuser”时。

标签: java authentication active-directory ldap


【解决方案1】:

Context.SECURITY_PRINCIPAL 必须是您正在使用的上下文中的有效主体名称。 (LDAP - 在您的情况下为 AD。)

因此,完全限定的 DN 或 userPrincipalName 或 domain\samaccountname 应该可以工作。 我们已经提出了一些JNDI samples

【讨论】:

  • 我尝试了以下用户名中不带点的类型:cn=testuser,ou=User,dc=test,dc=local - 不起作用,TEST\\testuser - 不起作用, userPrincipalName=testuser@test.local - 不起作用。所以我不知道为什么,但它现在可以工作以防万一,当我给“testuser”时。
  • "49 52e 1326 ERROR_LOGON_FAILURE 在用户名有效但密码/凭据无效时返回。"当我使用“testuser”SECURITY_PRINCIPAL 时,错误代码也很有趣,因为密码是正确的。
  • 查看了winserver的安全日志,好像win无法解析principal:env.put(Context.SECURITY_PRINCIPAL, "cn=testuser,ou=User,dc=test,dc =本地“);和win事件日志:登录失败的帐户:安全ID:NULL SID 帐户名:cn=test,ou=User,dc=test,dc=local 帐户域:test.local 失败信息:失败原因:发生错误在登录期间。状态:0xc000006d 子状态:0xc000006d
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-08
  • 2012-09-02
  • 1970-01-01
  • 1970-01-01
  • 2016-03-27
相关资源
最近更新 更多