java - 在 Java 中连接到 LDAP Active Directory,无需用户名和密码

标签 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,而无需输入用户名和密码?

在 Java 中是否有类似 C# 的等效方法(无需输入用户名和密码)?

最佳答案

如果使用 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)

关于java - 在 Java 中连接到 LDAP Active Directory,无需用户名和密码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40322263/

相关文章:

c# - 表单应用程序未接收鼠标或键盘事件

c# - UWP 等待用户与 ContentDialog 交互

asp.net - Application_AuthenticateRequest 命中所有请求,包括图片和js文件

c# - 请求身份验证 token 的应用程序被禁用或配置不正确

authentication - 我刚刚了解到 JWT 的缺点 - 有什么替代方案?

java - Tomcat(嵌入),无需重启即可进行更改

java - 删除 &lt;!-- 和//--> 之间的内容

c# - .NET 中 XPATH 中的 id()

java - 使用 MANIFEST.MF 显示 Java 应用程序初始屏幕;有没有办法设置最短屏幕时间?

java - org.apache.ws.security.WSSecurityException : General security error (No certificates were found for decryption (KeyId))