2009-07-22 15 views
5

Potrzebuję spożywać reszta usług internetowych z java, przekazując poświadczenia konta użytkownika domeny.uwierzytelnianie za pomocą ntlm (lub Kerberos) przy użyciu java UrlConnection

teraz robię to z klasycznymi asp


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

i z 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(); 

w jaki sposób można to osiągnąć z java? Weź pod uwagę, że nie korzystam z poświadczeń aktualnie zalogowanego użytkownika, określam konto domeny (mam hasło)

proszę mi powiedzieć, że to tak proste, jak z klasycznym asp i asp.net .. ..

Odpowiedz

0

Według this page, możesz można użyć wbudowanych klas JRE, z zastrzeżeniem, że wcześniejsze wersje Java może to zrobić tylko na komputerze z systemem Windows.

Jednakże, jeśli chcesz żyć z niezależną stroną, IMO Apache Commons HttpClient 3.x jest drogą do zrobienia. Here to dokumentacja dotycząca korzystania z uwierzytelniania, w tym NTLM. Ogólnie HttpClient jest znacznie bardziej funkcjonalną biblioteką.

Najnowsza wersja HttpClient to 4.0, ale podobno ta wersja does not support NTLM ta wersja requires a tiny bit of extra work.

Oto co myślę kod będzie wyglądać, chociaż nie próbowałem go:

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()); 

Powodzenia.

+0

Hej Matt, dziękuję za odpowiedź, ale zastanawiam się, czy to możliwe, aby to zrobić, z techni-w zajęciach JRE za pomocą protokołu Kerberos zamiast NTLM .. Chodzi mi o to, że Kerberos nie jest pptopietary jak NTLM ... – opensas

+0

Ostatnio słyszałem, że klient Apache NIE obsługuje NTLMv2. I niechętnie sięgają do JCIFS, ponieważ a) twierdzą, że LGPLv2 nie jest zgodny z ich licencją i b) są ogólnie znużeni materiałami MS. Ale to nie ma znaczenia, ponieważ jeśli chcesz współdziałać z firmą Microsoft, NTLM jest wspólnym mianownikiem mechanizmów uwierzytelniania.Kerberos nie działa, jeśli klient nie ma dostępu do kontrolera domeny lub jeśli synchronizacja czasu jest wyłączona lub jeśli DNS nie jest całkiem poprawny lub ... itd. – user8134

+0

Witaj ioplex. Nie jestem pewien, gdzie to usłyszałeś, ale jest niepoprawny. Sprawdź dokumenty, z którymi się łączyłem. Z powodzeniem użyłem NTLM zarówno z HttpClient 3.x, jak iz 4.0. –

-2

Zobacz klasę SpnegoHttpURLConnection w projekcie filtru HTTP serwletów SPNEGO. Ten projekt ma również kilka przykładów.

Ten projekt ma client library, który w zasadzie robi to, co robisz w swoim przykładzie.

spojrzeć ten przykład z javadoc ...

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

    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()); 
} 
+0

faktycznie działa bez żadnych bibliotek z kodem conn.setRequestProperty ("Authorization", "Basic" + "" + token); – Daniel

+2

To nie odpowiada na pytanie. To rozwiązanie działa w przypadku uwierzytelniania podstawowego, ale nie działa w przypadku uwierzytelniania Kerbos lub NTLM, ponieważ pytanie jest zadawane. –

0

kompatybilny rozwiązanie dla java.net.URLStreamHandler i java.net.URL jest 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(); 

Możesz także użyć java.net.Proxy w url.openConnection (proxy).

Zastosowanie Maven zależność:

<dependency> 
     <groupId>com.intersult</groupId> 
     <artifactId>http</artifactId> 
     <version>1.1</version> 
    </dependency> 
Powiązane problemy