簡體   English   中英

使用httpclient 4.2.1進行NTLM身份驗證

[英]NTLM authentication with httpclient 4.2.1

我需要對需要NTLM身份驗證的URL執行HTTP GET。 我可以在MacBook Pro上使用Firefox或Chrome訪問該URL。 瀏覽器要求輸入用戶名/密碼組合並且它有效。 我現在正嘗試使用HttpClient從Groovy做同樣的事情。 我遵循了NTLM支持指南 ,但我總是得到401 Unauthorized返回。 回復中還有這句話:

您無權使用您提供的憑據查看此目錄或頁面,因為您的Web瀏覽器正在發送Web服務器未配置為接受的WWW-Authenticate標頭字段。

我在這段代碼中嘗試了servername和domain(遠程windows pc不在域上)的各種組合,但我總是得到相同的響應。

httpclient.getCredentialsProvider().setCredentials(
new AuthScope("myserver", -1), 
new NTCredentials("username", "password", "MYSERVER", "MYDOMAIN"));

有人遇到同樣的問題並設法解決了嗎? 請注意,這是一個使用IIS的外部程序,所以我認為我不能在那里更改任何設置。

編輯:

與我所說的不同,我設法更改IIS中的安全設置以接受BASIC認證,所以我不再有問題了。

編輯:

根據我設置Kerberos或NTLM(兩者都是單點登錄)的經驗,當您已經登錄到系統時,根本不需要輸入用戶名/密碼。

我很確定當瀏覽器詢問用戶名/密碼組合時,根本不是NTLM身份驗證。 服務器端應用程序很可能具有HTTP Basic Digest的回退方案(這就是它顯示用戶名/密碼組合的原因)。 使用NTLM,您將永遠不必輸入您的用戶名/密碼(委托人/憑證),因為服務器將通過瀏覽器,操作系統,服務器和Active Directory服務器之間的協商機制識別您的身份。

如果您的MacBook Pro在OS / X上運行,您還需要將OS / X添加到域中。 您的服務器還需要位於添加客戶端OS / X的同一域中。 這可能不是一個簡單的案例。 可能需要一些外部工具/驅動程序。 可能是一個很好的候選人(但我沒有嘗試過)。

NTLM需要客戶端都是與服務器相同的域的成員,因此兩者都需要在Active Directory域中注冊。 如果您的服務器不在域中,那將是另一組問題。

為了使您的瀏覽器適用於NTLM,您需要安裝插件(ntlmauth-plugin?)。 但我還沒有在MacOS / X上嘗試過。 即使在Windows中,您仍然需要一個插件才能使用NTLM成功運行Firefox。

HttpClient不適合我,但最終下面的代碼工作。 參考 - http://docs.oracle.com/javase/7/docs/technotes/guides/net/http-auth.html

供快速參考 -

public static String getResponse(String url, String userName, String password) throws IOException {
Authenticator.setDefault(new Authenticator() {
  @Override
  public PasswordAuthentication getPasswordAuthentication() {
    System.out.println(getRequestingScheme() + " authentication");
    return new PasswordAuthentication(userName, password.toCharArray());
  }
});

URL urlRequest = new URL(url);
HttpURLConnection conn = (HttpURLConnection) urlRequest.openConnection();
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setRequestMethod("GET");

StringBuilder response = new StringBuilder();
InputStream stream = conn.getInputStream();
BufferedReader in = new BufferedReader(new InputStreamReader(stream));
String str = "";
while ((str = in.readLine()) != null) {
  response.append(str);
}
in.close();

return response.toString();

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM