在Java应用程序中使用NTLM身份验证(Using NTLM authentication in

2019-07-20 08:59发布

我想使用Windows NTLM身份验证在我的Java应用程序内网用户透明地进行身份验证。 如果使用他们的浏览器(单点登录)的用户应该不会注意到任何认证。

我发现使用NTLM支持几个库,但不知道用哪一个:

  • http://spnego.sourceforge.net/
  • http://sourceforge.net/projects/ntlmv2auth/
  • http://jcifs.samba.org/
  • http://www.ioplex.com/jespa.html
  • http://www.luigidragone.com/software/ntlm-authentication-in-java/

任何建议从哪里开始?

Answer 1:

出了上述名单中,只有NTLMv2身份,身份验证和Jespa支持NTLMv2的。 Jespa是可行的,但商业化。 NTLMv2的-auth的我还没有尝试过,但它是基于从Liferay的代码,这是我见过前的工作。

“NTLM认证,在Java的”只有NTLMv1身份,这是旧的,不安全的,并且在数量不断减少的环境随着人们升级到较新的Windows版本的作品。 JCIFS曾经有一个NTLMv1身份HTTP认证过滤器,但在后来的版本中删除,因为它的方式是实施达在不安全的协议的中间人攻击。 (同样的似乎是“NTLM认证功能于Java的也是如此。)

在“SPNEGO”项目是Kerberos的不是NTLM。 如果你想完全复制为IWA IIS做它,你需要支持NTLMv2和Kerberos两者( 'NTLM' 权威性 '协商' 权威性,NTLMSSP式-SPNEGO认证和NTLM身份伪装,作为协商AUTH)。



Answer 2:

路易吉·德拉戈的剧本真的老了,似乎总是失败。

HttpURLConnection的可以与NTLM工作,如果你添加库JCIFS ,这个例子使用最新的JCIFS-1.3.18 :

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.UnknownHostException;
import java.util.HashMap;
import java.util.Map;

import org.apache.http.impl.auth.NTLMEngineException;

public class TestNTLMConnection {
    public static void main(String[] args) throws UnknownHostException, IOException, NTLMEngineException {
        // Method 1 : authentication in URL
        jcifs.Config.registerSmbURLHandler();
        URL urlRequest = new URL("http://domain%5Cuser:pass@127.0.0.1/");

        // or Method 2 : authentication via System.setProperty()
        // System.setProperty("http.auth.ntlm.domain", "domain");
        // System.setProperty("jcifs.smb.client.domain", "domain");
        // System.setProperty("jcifs.smb.client.username", "user");
        // System.setProperty("jcifs.smb.client.password", "pass");
        // Not verified // System.setProperty("jcifs.netbios.hostname", "host");
        // System.setProperty("java.protocol.handler.pkgs", "jcifs");
        // URL urlRequest = new URL("http://127.0.0.1:8180/simulate_get.php");

        HttpURLConnection conn = (HttpURLConnection) urlRequest.openConnection();

        StringBuilder response = new StringBuilder();

        try {
            InputStream stream = conn.getInputStream();
            BufferedReader in = new BufferedReader(new InputStreamReader(stream));

            String str = "";
            while ((str = in.readLine()) != null) {
                response.append(str);
            }
            in.close();   

            System.out.println(response);
        } catch(IOException err) {
            System.out.println(err);
        } finally {
            Map<String, String> msgResponse = new HashMap<String, String>();

            for (int i = 0;; i++) {
                String headerName = conn.getHeaderFieldKey(i);
                String headerValue = conn.getHeaderField(i);
                if (headerName == null && headerValue == null) {
                    break;
                }
                msgResponse.put(headerName == null ? "Method" : headerName, headerValue);
            }

            System.out.println(msgResponse);
        }
    }
}

如果您想了解每个握手的内容,你可以找到使用JCIFS和插座上的另外一个例子线程 。



Answer 3:

相对从你给的名单,我会去与JCIFS 。 图书馆是成熟的,他们的文档是好的。 最糟糕的是,他们有相当定期发布,而最后一个是2011十一月

Personal Experience :那是相当容易上手比别人时,我已经尝试(SPNEGO和ntmv2auth)



Answer 4:

参考: https://jcifs.samba.org/src/docs/faq.html#ntlmv2

问:JCIFS支持NTLMv2?
答: 。 截至1.3.0,JCIFS完全支持NTLMv2的,默认情况下使用它。

注:NTLM HTTP SSO过滤器所用的是包含JCIFS不能够支持NTLMv2。



文章来源: Using NTLM authentication in Java applications