【问题标题】:java - Active Directory - authentication using base dnjava - Active Directory - 使用基本 dn 进行身份验证
【发布时间】:2015-10-06 11:41:30
【问题描述】:

我编写了一个测试代码,用于通过 Active Directory 服务器对用户进行身份验证。我可以使用下面的代码使用绑定 dn 进行身份验证。

public static void main(String[] args) {

    LdapContext ldapContext = null;

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

    env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
    env.put(Context.PROVIDER_URL, "ldaps://10.121.85.24:636");
    env.put(Context.SECURITY_PROTOCOL, "ssl");
    env.put(Context.SECURITY_PRINCIPAL, "EXTLDAPTEST\batty"); // line 1
    env.put(Context.SECURITY_CREDENTIALS, "mypassword");
    env.put("com.sun.jndi.ldap.read.timeout", Integer.toString(8000));
    env.put("java.naming.ldap.factory.socket", "com.auth.server.TrustAllSSLSocketFactory" );

    try {
        ldapContext = new InitialLdapContext(env, null);
    } catch (Exception e) {
        e.printStackTrace();
    }

    if (ldapContext != null)
    {
        System.out.println("Authenticatied");
    }
}

但是当我用

替换第 1 行时
env.put(Context.SECURITY_PRINCIPAL, "CN=batty,OU=Unsorted,OU=EDN Users,OU=User accounts,DC=extLDAPTest,DC=local"); // line 1

抛出异常

javax.naming.AuthenticationException:[LDAP:错误代码 49 - 80090308:LdapErr:DSID-0C0903A9,注释:AcceptSecurityContext 错误,数据 52e,v1db1

AD的树结构是:

我在尝试使用完整 dn 进行身份验证时做错了吗?

编辑 1: 当我使用服务帐户获取完整的 dn 使用

NamingEnumeration<?> aa = context.list("OU=Unsorted,OU=EDN Users,OU=User accounts,DC=extLDAPTest,DC=local");

我得到以下结果:

CN=batty,OU=Unsorted,OU=EDN 用户,OU=用户帐户,DC=extLDAPTest,DC=local

这与我通过身份验证相同。

编辑 2 :我使用完整 dn 的原因是,我将获得服务帐户和子树的 dn。现在,同一个用户可以存在于不同的子树中。所以我想从特定的子树中对其进行身份验证。

【问题讨论】:

    标签: java active-directory ldap


    【解决方案1】:

    与LDAP相关的错误代码49是由无效的凭据引起的。

    但您可以使用 ADSI Edit 或 AD Explorer 等应用程序来获取对象的 DN。您可以只使用它们来查看相关对象的“distinguishedName”属性,也可以使用特定于每个应用程序的其他方法。

    或用户 LDAPExplorerTool 2. 并找出您想要获取 dn 的 CN。您可以在 secDN 属性中获取其值:

    【讨论】:

      【解决方案2】:

      我想知道为什么您需要使用完整的 DN 来指定用户名? 您可以使用 DOMAIN\USERUSER@DOMAIN 格式对 AD 进行身份验证。

      我个人从未使用过任何其他格式,但RFC 2829 指定了以下基于 DN 的身份验证身份格式:dn: DN。在您的情况下,SECURITY.PRINCIPAL 看起来是 dn:CN=batty,OU=Unsorted,OU=EDN Users,OU=User accounts,DC=extLDAPTest,DC=local。再一次,我从未使用过 DN 格式,但尝试一下,看看建议的解决方案是否有效。

      希望这会有所帮助。

      【讨论】:

      • 我认为这是我正在使用的 DN 格式并且不起作用
      • 我使用完整 dn 的原因是,我将获得服务帐户和子树的 dn。现在,同一个用户可以存在于不同的子树中。所以我想从特定的子树中对其进行身份验证。
      • 不能在同一个 AD 域中创建同名用户,无论其在树中的位置如何。同名用户只能在不同的域中创建。知道域名和用户名就足够了。不需要知道用户对象在树中的位置。不过,请查看 RFC 2829。它说基于 DN 的用户名应该采用“dn: DISTINGUIISHED NAME”的格式。所以在你的情况下,它看起来像“dn:CN=batty,OU=Unsorted,OU=EDN Users,OU=User accounts,DC=extLDAPTest,DC=local”。注意字符串“dn:”的开头。
      猜你喜欢
      • 1970-01-01
      • 2016-05-12
      • 2018-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-27
      相关资源
      最近更新 更多