2012-10-04 110 views
3

我需要爲需要NTLM身份驗證的URL執行HTTP GET。我可以在MacBook Pro上使用Firefox或Chrome訪問URL。瀏覽器要求提供用戶名/密碼組合,並且它可以工作。我現在正在嘗試使用HttpClient從Groovy執行相同的操作。我跟着NTLM support guide,但我總是得到一個401 Unauthorized回來。也有這句話的迴應:使用httpclient 4.2.1的NTLM身份驗證

您沒有權限使用您提供,因爲您的Web瀏覽器發送一個 WWW身份驗證頭字段中 憑據查看該目錄或網頁的Web服務器未配置爲 接受。

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

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

任何人都有同樣的問題,並設法解決它?請注意,這是一個使用IIS下的外部程序,所以我不認爲我可以在那裏更改任何設置。

編輯:

不像我說過的話,我設法更改IIS的安全設置接受BASIC authentation,所以我沒有問題了。

回答

0

編輯:

在我與設置Kerberos或NTLM經驗(都是單點登錄),你不必在所有輸入的用戶名/密碼,當您已經登錄到系統中。

我非常確定,當瀏覽器詢問用戶名/密碼組合時,根本不是NTLM身份驗證。很可能服務器端應用程序對HTTP Basic Digest有一個回退機制(爲什麼它顯示用戶名/密碼組合)。使用NTLM,您永遠不必輸入您的用戶名/密碼(委託人/憑證),因爲服務器會通過瀏覽器,操作系統,服務器和Active Directory服務器之間的協商機制識別您是誰。

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

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

爲了讓您的瀏覽器能夠與NTLM協同工作,您需要安裝插件(ntlmauth-plugin?)。但我從來沒有在MacOS/X上嘗試過。即使在Windows中,爲了使用NTLM成功運行Firefox,您仍然需要一個插件。

+0

我的MacBook Pro運行OS X 10.8.2,而不是Windows。 –

+0

然後你有更多的障礙要克服...請參閱我編輯的評論。 –

+1

Mac不需要爲NTLM加入域(但會用於Kerberos。)NTLM *可以*使用用戶名/密碼執行身份驗證。如果您登錄到Windows,它將嘗試使用會話的當前憑據,如果失敗,會提示。將DOMAIN \用戶名和密碼傳遞給NTLM非常合適,特別是在非Windows機器上。 –

0

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

}