Java 使用NTLM安全协议连接到LDAP(Active Directory)

Java 使用NTLM安全协议连接到LDAP(Active Directory),java,active-directory,ntlm,sasl,Java,Active Directory,Ntlm,Sasl,目前,我使用用户和密码作为ldap的连接凭据,以便对AD的用户进行身份验证 对于这里的身份验证,我使用InitialDirContext为Active Directory创建了一个初始上下文,在这里我们提供了一组环境属性,其中将包含身份验证信息 我的代码如下所示: env = new Hashtable(); env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory"); env.put(Context.

目前,我使用用户和密码作为ldap的连接凭据,以便对AD的用户进行身份验证

对于这里的身份验证,我使用InitialDirContext为Active Directory创建了一个初始上下文,在这里我们提供了一组环境属性,其中将包含身份验证信息

我的代码如下所示:

env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL, ...);
env.put(Context.SECURITY_AUTHENTICATION, "simple");
env.put(Context.SECURITY_PRINCIPAL, ...);
env.put(Context.SECURITY_CREDENTIALS, ...);
env.put("com.sun.jndi.ldap.connect.timeout", ...);

try {
  ctx = new InitialLdapContext(env);
}
catch (NamingException e) {
    System.out.println("error")
}
我想更改此代码,因此它将使用NTLM对输入的用户名和密码作为LDAP凭据进行身份验证

你能给我举个例子吗

NTLM–是一套Microsoft安全协议,提供 -认证 -完整性
-保密性

算了吧。Java中没有对NTLM的SASL支持。使用GSS-API。永远不要使用专有技术,否则会有死胡同。永远不要使用简单的身份验证,它在明文上传输密码。至少使用Digest MD5。

我还想使用NTLM连接到Microsoft LDAP目录

不幸的是,Microsoft在LDAP管理权限方面存在差异,这取决于您是使用Kerberos/NTLM还是使用BIND/MD5连接,我对使用标准管理工具感到厌烦。Kerberos仅限于用户、客户端用户和LDAP服务器在同一个域中,并且需要为JRE配置易出错的JAAS配置文件

因为它是最常用的目录,而且我也找不到任何现有的解决方案,所以我尝试自己创建一个NTLM绑定解决方案,我成功了

它是一个单独的Java类文件,通过一个附加的LDAP绑定类扩展了未绑定的Java LDAP SDK:

该解决方案使用未绑定的JavaLDAP SDK,对于NTLM处理,它使用samba.org的JCIF Java库。
由于使用JCIF,它与平台无关,不需要在Windows上运行。

我不同意。当绑定请求使用强密码通过SSL传输时,DIGEST-MD5比简单身份验证弱。DIGEST-MD5要求LDAP目录服务器能够解密密码,这意味着必须使用可逆加密来存储密码。使用简单的身份验证,密码可以存储在单向散列中,如SSHA512,它比可逆加密更强大。因此,应该避免使用DIGEST-MD5。我不同意你的说法。这将使任何共享秘密机制过时。摘要是安全的,因为只要服务器受到保护,每个秘密都是安全的。基本安全从来都不安全。这将使Active Directory与PKI不一样安全。感谢Michael的建议:如果您想要一种创建DirContext的简单方法,可以尝试我即将发布的。它还没有发布,但已经在这里生产了一段时间。