我有一个用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#中执行此操作(如果没有输入用户名和密码)?
答案 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”进行搜索,而无需传递用户名和密码。
答案 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