客户请求实现一个简单的类似 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/