我尝试使用为linux服务器创建的凭据连接到活动目录服务器。服务器上有一个用于提供凭据的Web界面,而且我无法使用我提供的凭据进行连接。要解决问题,我只是尝试使用与服务器上的代码相同的方法从Java本地计算机进行连接。
public static void main(String[] args) throws NamingException {
final String ldapAdServer = "ldap://server:port";
final String ldapSearchBase = "OU=Users,OU=xxx,DC=yyy,DC=zzz,DC=aaa,DC=com";
final String ldapUsername = "user";
final String ldapPassword = "password";
final String ldapAccountToLookup = "lookup";
final String dc = ",DC=yyy,DC=zzz,DC=aaa,DC=com";
final String ou = ",OU=Uncommon Users,OU=xxx";
Hashtable<String, Object> env = new Hashtable<String, Object>();
env.put(Context.SECURITY_AUTHENTICATION, "simple");
if(ldapUsername != null) {
env.put(Context.SECURITY_PRINCIPAL, "CN=" + ldapUsername + ou + dc);
}
if(ldapPassword != null) {
env.put(Context.SECURITY_CREDENTIALS, ldapPassword);
}
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL, ldapAdServer);
// the following is helpful in debugging errors
//env.put("com.sun.jndi.ldap.trace.ber", System.err);
LdapContext ctx = new InitialLdapContext(env, null);
ConnectLdap ldap = new ConnectLdap();
try {
ldap.findUsers(ctx, ldapSearchBase);
ldap.findAccountByAccountName(ctx, ldapSearchBase, ldapAccountToLookup);
} catch(Exception e) {
e.printStackTrace();
}
}
有许多类似问题的问题,例如Java ldap authentication issue,应该使用cn而不是uid。这一个Randomly getting LDAP Error 49, data 52e on random users?和这一个LDAP + Java Aplication Authentication error code 49 - 52e,其中AD不允许匿名绑定,因为我提供用户名和密码,我认为我不会尝试这样做。这个LDAP: error code 49 - Simple Bind Failed: NT_STATUS_LOGON_FAILURE问题是尝试使用相对的专有名称进行连接,而我也不认为我这样做了。我可以使用此用户名和密码与客户端连接,导航到我连接的用户并获取用户的完整可分辨名称。这个完整的dn是我在security_principal中提供的,我缺少什么?
以下是尝试构造InitialLdapContext
时发生的异常Exception in thread "main" javax.naming.AuthenticationException: [LDAP: error code 49 - 80090308: LdapErr: DSID-0C0903A9, comment: AcceptSecurityContext error, data 52e, v1db1
答案 0 :(得分:0)
这一行
env.put(Context.SECURITY_PRINCIPAL, "CN=" + ldapUsername + ou + dc);
应该是
env.put(Context.SECURITY_PRINCIPAL, ldapUsername@dc1.dc2.dc3.dc4);
如果您使用客户端,则在用户的属性中使用userPrincipalName