使用Java UrlConnection进行NTLM(或Kerberos)身份验证

6

我需要使用Java消费REST Web服务,并传递域用户帐户的凭据。

目前我正在使用经典的ASP进行操作。


set xmlHttp = server.createObject( "msxml2.serverxmlhttp" )
xmlHttp.open method, url, false, domain & "\" & user, password
xmlHttp.send body
out = xmlHttp.responseText
set xmlHttp = nothing

使用 ASP.NET



HttpWebRequest request = (HttpWebRequest) WebRequest.Create( url );

request.Credentials = new NetworkCredential(user, password, domain);

request.Method = WebRequestMethods.Http.Get

HttpWebResponse response = (HttpWebResponse) request.GetResponse();

StreamReader outStream = new StreamReader( response.GetResponseStream(), Encoding.UTF8) ;

output = outStream.ReadToEnd();


如何使用Java实现这个功能?请注意,我不是使用当前登录用户的凭据,而是指定域帐户(我有密码)。
请告诉我这和经典ASP和ASP.NET一样容易...
3个回答

0

根据此页面,您可以使用内置的JRE类,但需要注意的是早期版本的Java仅限于在Windows机器上这样做。

然而,如果您愿意接受第三方依赖项,则IMO Apache Commons HttpClient 3.x 是更好的选择。这里是包括NTLM身份验证在内使用文档的链接。一般来说,HttpClient是一个更功能强大的库。

最新版的HttpClient是4.0,但显然此版本不支持NTLM,所以这个版本需要一点额外的工作

以下是我认为的代码样例,尽管我还没有试过:

HttpClient httpClient = new HttpClient();
httpClient.getState().setCredentials(AuthScope.ANY, new NTCredentials(user, password, hostPortionOfURL, domain));
GetMethod request = new GetMethod(url);
BufferedReader reader = new InputStreamReader(request.getResponseBodyAsStream());

祝你好运。


嘿,马特,非常感谢你的回答,但我想知道是否可能使用内置的JRE类,而不是NTLM,使用kerberos来完成这个任务...我的意思是,kerberos不像NTLM那样是专有的东西... - opensas
据我所知,Apache客户端不支持NTLMv2。而且他们不太愿意使用JCIFS,因为a)他们声称它的LGPLv2与他们的许可证不兼容,b)他们通常对微软的东西感到疲倦。但这并不重要,因为如果你想与Microsoft进行交互,NTLM是验证机制的共同点。如果客户端无法访问域控制器,或时间同步出了问题,或DNS不正确等等,则Kerberos无法工作。 - user8134
嗨ioplex。我不确定你从哪里听到这个,但是它是不正确的。请查看我提供的文档。我已经成功地在HttpClient 3.x和4.0中使用了NTLM。 - Matt Solnit
第一个链接已经失效。 - Attila Csipak

0
一个兼容java.net.URLStreamHandler和java.net.URL的解决方案是com.intersult.net.http.NtlmHandler:
NtlmHandler handler = new NtlmHandler();
handler.setUsername("domain\\username");
handler.setPassword("password");
URL url = new URL(null, urlString, handler);
URLConnection connection = url.openConnection();

你也可以在url.openConnection(proxy)中使用java.net.Proxy。

使用Maven-Dependency:

    <dependency>
        <groupId>com.intersult</groupId>
        <artifactId>http</artifactId>
        <version>1.1</version>
    </dependency>

-2

请查看SPNEGO HTTP Servlet Filter项目中的SpnegoHttpURLConnection类。该项目还有一些示例。

该项目有一个客户端库,几乎可以完成您在示例中所做的工作。

请查看javadoc中的此示例...

 public static void main(final String[] args) throws Exception {
     final String creds = "dfelix:myp@s5";

     final String token = Base64.encode(creds.getBytes());

     URL url = new URL("http://medusa:8080/index.jsp");

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

     conn.setRequestProperty(Constants.AUTHZ_HEADER
             , Constants.BASIC_HEADER + " " + token);

     conn.connect();

     System.out.println("Response Code:" + conn.getResponseCode());
 }

实际上,这段代码可以在不使用任何库的情况下正常工作:conn.setRequestProperty("Authorization", "Basic" + " " + token); - Daniel
2
这个回答并没有解决问题。该解决方案适用于基本身份验证,但不适用于问题所要求的Kerbos或NTLM身份验证。 - Scott Boring

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接