2009-07-22 59 views
5

ドメインユーザーアカウントの資格情報を渡して、Javaで残りのWebサービスを使用する必要があります。java UrlConnectionを使用してntlm(またはkerberos)で認証

今私は


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とasp.netと同じように簡単です教えてください。 ..

答えて

0

は、組み込みのJREクラスを使用します。以前のバージョンのJavaではWindowsマシンでのみこれを実行できます。

しかし、サードパーティの依存関係を築きたい場合は、IMO Apache Commons HttpClient 3.xがおすすめです。 Hereは、NTLMを含む認証を使用するためのドキュメントです。一般に、HttpClientははるかに機能的なライブラリです。

のHttpClientの最新バージョンは4.0、しかしどうやらこのバージョンdoes not support NTLMこのバージョンrequires a tiny bit of extra workです。ここで

は、私はそれを試していませんが、私は、コードは次のようになりを考えるものです:

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

幸運。

+0

ねえマット、感謝あなたの答えのためにたくさん、それは代わりにNTLMのKerberosを使用して、釜インJREクラスで、これを実行することが可能ですかしら...私はケルベロスがNTLMのようなptopietaryなものではないことを意味します。 – opensas

+0

最後に、ApacheクライアントはNTLMv2をサポートしていないと聞きました。そして、彼らはLGPLv2が彼らのライセンスと互換性がないと主張し、b)彼らは一般的にMSのものに疲れているので、彼らはJCIFSを利用するのを嫌っている。しかし、それは重要ではありません。なぜなら、Microsoftと相互運用したいのであれば、NTLMは認証メカニズムの共通点です。クライアントがドメインコントローラにアクセスできない場合、または時間同期がオフの場合やDNSが正しくない場合など、Kerberosは機能しません。 – user8134

+0

こんにちはioplex。私はあなたがこれを聞いたかどうか分からないが、それは間違っている。私がリンクしているドキュメントをチェックしてください。 NTMLをHttpClient 3.xと4.0でうまく使用しました。 –

-2

SPNEGO HTTPサーブレットフィルタプロジェクトのSpnegoHttpURLConnectionクラスを見てください。このプロジェクトにはいくつかの例があります。

このプロジェクトの内容は、client libraryです。これは、あなたの例でやっていることとほぼ同じです。

のjavadocからこの例を見てみましょう... java.net.URLStreamHandlerとのjava.net.URLため

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

は実際にはコードconn.setRequestProperty( "Authorization"、 "Basic" + "" + token)を持つ任意のライブラリなしで動作します。 – Daniel

+2

これは質問に答えません。この解決策はBasic認証では機能しますが、KerbosやNTLM認証では質問に答えることができません。 –

0

互換性のある解決策は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> 
     <groupId>com.intersult</groupId> 
     <artifactId>http</artifactId> 
     <version>1.1</version> 
    </dependency>