使用Java连接到LDAP Active Directory,无需用户名和密码

时间:2016-10-29 18:26:46

标签: java c# authentication active-directory ldap

我有一个用C#编写的简单应用程序。 该应用程序适用于Windows机器和登录到Active Directory的用户帐户。

在该应用程序中,我从LDAP Active Directory中检索一些信息。

在C#中,我以这种方式与LDAP建立连接:

DirectoryEntry de = new DirectoryEntry("LDAP://OU=places,DC=system,DC=org");

然后我检索所需的数据(例如):

DirectorySearcher searcher = new DirectorySearcher(de);
searcher.Filter = "(telephone=111222333)";
SearchResultCollection resultCollection = searcher.FindAll();

正如您在该应用程序中看到的,我不需要使用用户名和密码登录LDAP,但只需要输入正确的路径:

DirectoryEntry的构造函数如下:

public DirectoryEntry(
    string path
)

当然有一个带有用户名和密码的构造函数,但正如我所说,我不需要使用它:

public DirectoryEntry(
    string path,
    string username,
    string password
)

我尝试在Java中检索相同的信息,并使用了类似的代码:

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

env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL, "ldap://ad.host:389");
env.put(Context.SECURITY_PRINCIPAL, "username");
env.put(Context.SECURITY_CREDENTIALS, "password");

DirContext ldap = new InitialDirContext(env);

然后我检索所需的数据(例如):

SearchControls searchControls = new SearchControls();
searchControls.setSearchScope(SearchControls.SUBTREE_SCOPE);
NamingEnumeration tel = ldap.search("OU=places,DC=system,DC=org", "(telephone=111222333)", searchControls);

但是有一个区别。如你所愿,如果我想连接到那个LDAP Active Directory,我需要在Java中输入用户名和密码。

如果我没有输入用户名和密码,我会看到以下错误:

Exception in thread "main" javax.naming.NamingException:[LDAP: error code 1 - 000004DC: LdapErr: DSID-0C0906E8, comment: In order to perform this operation a successful bind must be completed on the connection., data 0, v1db1;] remaining name 'OU=places,DC=system,DC=org'

我的问题是,我是否可以使用Java从同一台计算机登录到同一个LDAP Active Directory而无需输入用户名和密码?

是否有类似于在C#中执行此操作(如果没有输入用户名和密码)?

3 个答案:

答案 0 :(得分:2)

如果使用env.put(Context.SECURITY_AUTHENTICATION, "none");不起作用,那么您的AD环境可能不支持匿名身份验证,这是可以理解的。默认情况下禁用匿名身份验证。

在C#中使用new DirectoryEntry(...);时,您可能看起来没有使用任何凭据,但它确实使用了当前登录用户的凭据。因此,它借用您自己的凭据来拨打AD。

Java不这样做。事实上,从我刚才所做的简短的谷歌搜索来看,似乎很难做到这一点,如果这就是你想要做的事情。

这里有一个问题:Query Active Directory in Java using a logged on user on windows

那里的评论提供了一些产品可供研究。

但如果您不想使用任何可能使事情复杂化的第三方产品,您只需提供用户名和密码即可。

如果要在C#中测试匿名身份验证,可以使用以下内容:

new DirectoryEntry(ldapPath, null, null, AuthenticationTypes.Anonymous)

答案 1 :(得分:0)

我找到了创建解决方案并运行powershell脚本的解决方案。 在powershell脚本中,您可以使用“ System.DirectoryServices”进行搜索,而无需传递用户名和密码。

请参阅Querying Active directory

答案 2 :(得分:0)

  

我有一个用C#编写的简单应用程序。该应用程序可在Windows计算机和登录到Active Directory的用户帐户上运行。

我想您的C#应用​​程序仅使用Windows API,该API在幕后会自动通过Windows会话的Kerberos票证授予票证进行身份验证。

如果要使用其他编程语言来执行此操作,则必须使用SASL机械GSSAPI进行LDAP SASL绑定请求。但是你的例如基于Java的LDAP客户端还必须利用Windows凭据缓存。

另请参阅:Java Platform, Standard Edition Security Developer’s Guide