通过 LDAP 验证 NTLM 身份验证以检索用户名和域的 Java 方法

标签 java authentication ldap ntlm

客户请求实现一个简单的类似 SSO 的 NTLM validator 。因此,我需要找到一种方法来验证在尝试连接到服务器时哪个用户是否已登录。

使用 JavaScript,我花了大约 5 分钟处理这个包: https://www.npmjs.com/package/express-ntlm

您可以为包定义 LDAP 服务器,NTLM 协商将生成“DomainName”、“UserName”、“Workstation”和“Authenticated”值。我已经成功实现了。

是否有一个库或其他本地方法可以使用 Java 完成此任务,就像使用 NodeJS 服务器一样简单?

我发现的一些解决方案需要凭据,但我没有或不想提供。 JavaScript 解决方案仅在提供的 LDAP 服务器上运行,因此可以肯定我不需要它们。

最佳答案

我对你的问题并不完全清楚,但我会尝试回答 native 部分并增强此answer在同一时间,或多或少涉及同一主题。

从 JDK 7 开始,我们看到以下 com.sun.security.ntlm native 包

$ unzip -l 1.7/jre/lib/rt.jar | grep -i ntlm
 4243  2015-04-10 19:56   com/sun/security/ntlm/Client.class
 1568  2015-04-10 19:56   com/sun/security/ntlm/NTLM$Reader.class
 1831  2015-04-10 19:56   com/sun/security/ntlm/NTLM$Writer.class
 6486  2015-04-10 19:56   com/sun/security/ntlm/NTLM.class
  617  2015-04-10 19:56   com/sun/security/ntlm/NTLMException.class
 3763  2015-04-10 19:58   com/sun/security/ntlm/Server.class
  939  2015-04-10 19:56   com/sun/security/ntlm/Version.class
  ... ...

不幸的是,这个包不适合直接使用,如 Oracle JDK-6982971 bug 中所述。其中指出:

The com.sun.security.ntlm package and classes inside it are not exposed as NON_CORE_PKGS and there not visible to javac.

从那里, native 解决方案依赖于此解决方法:使用可以从 here 下载的所有 com.sun.security.ntlm 源文件编译代码。 ,例如Client.java , NTLM.java ,..Server.verify 方法使您可以访问您在问题中提到的参数。请注意,此调试属性可以帮助您 (-Dntlm.debug)。

在此实现中,请注意,直到 JDK 1.7 才会编译,因为调用 String in switch Statement ,尽管您可以轻松向后移植到早期的 Java 版本。

我建议使用最新的可用源,因为错误可能很难在(例如 Java 7)Support Release Notes 中跟踪。 。截至撰写本文时,据我所知,当前使用的版本已在 OpenJDK JDK-7150092 bug 中列出。 .

我暂时没有使用此方法编写任何服务器代码,只编写了大约 100 行的 HTTP 客户端,这演示了该技术。最后要知道的一件事是,我所说的 native 类不是多线程的。

关于通过 LDAP 验证 NTLM 身份验证以检索用户名和域的 Java 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50678314/

相关文章:

ajax - ExtJS:使用 'Remember me' 功能登录

php - 我的 Facebook 登录对话框在 IE 中没有关闭

reactjs - Next-auth 检查用户是否是第一次登录

c++ - LDAP 的 ldap_search_s() 在 Windows Active Directory 上失败

java - 如何获取作为本地域名同步到 Azure AD 的 Windows 域 FQDN?

java - GUI 中的观察者/可观察对象

java - 与 hornetq 服务器通信时 STOMP header 中的目标错误

java - Jersey JAX-RS 注释接口(interface)而不是实现类会导致错误

java: ldap 命名异常

java - 如何使用 Collectors 制作 map 的 map