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

时间:2018-06-04 10:19:21

标签: java authentication ldap ntlm

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

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

您可以为包定义LDAP服务器,NTLM协商将导致“DomainName”,“UserName”,“Workstation”和“Authenticated”值。我已成功实施。

是否有一个库或其他本机方法可以像使用NodeJS-Server一样使用Java完成此操作?

我找到的一些解决方案需要凭据,我没有或不想提供。 JavaScript解决方案仅在提供LDAP服务器的情况下运行,因此我非常确定我不需要它们。

1 个答案:

答案 0 :(得分:1)

我的问题并不完全清楚,但我会尝试回答原生部分,并在同一时间增强此answer,这或多或少是关于相同的话题。

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

$ 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中所述:

  

com.sun.security.ntlm包及其中的类不是   暴露为NON_CORE_PKGS,javac不可见。

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

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

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

我现在没有使用此方法对任何服务器进行编码,但只有100行的HTTP客户端,这证明了这种技术。最后要知道的是,我所谈论的本机类并不是多线程的。