NTLM을 사용하여 DefaultHttpClient에 대한 선제 인증을 구현하려고합니다. 나는 정상적인 인증을 위해 잘 작동하는 Dan Hounshell에서 도서관을 발견했다.DefaultHttpClient를 통한 선점 인증
하지만 선제 인증으로이 작업을 수행하는 방법을 알아낼 수는 없습니다. 나는이 멋진 answer에 질문 Preemptive Basic authentication with Apache HttpClient 4을 발견 : 내 문제지만 좋은 아이디어
UsernamePasswordCredentials creds = new UsernamePasswordCredentials(username, password);
HttpRequest request = ...
request.addHeader(new BasicScheme().authenticate(creds, request));
완벽하지. 그래서 NTLMSchemeFactory
을 사용하여 AuthScheme
의 새 인스턴스를 만들어 내고 authenticate
함수를 제공합니다.
NTCredentials ntc = new NTCredentials("example.com/user:pwd");
httpPost.addHeader(new NTLMScheme(new JCIFSEngine()).authenticate(ntc, httpPost));
이 기능은 내가 예외거야 호출 될 때 :
org.apache.http.auth.AuthenticationException을 : 예기치 않은 상태 : 미숙
나는 것을 해결할 수있는 방법을 ?
POST /login/ HTTP/1.1
Content-Length: 21
Content-Type: application/x-www-form-urlencoded
Host: example.com
Connection: Keep-Alive
data=...
HTTP/1.1 401 Unauthorized
Content-Type: text/html
Server: Microsoft-IIS/7.5
WWW-Authenticate: Negotiate
WWW-Authenticate: NTLM
X-Powered-By: ASP.NET
Date: Wed, 12 Dec 2012 14:36:26 GMT
Content-Length: 1344
Much data...
POST /login/ HTTP/1.1
Content-Length: 21
Content-Type: application/x-www-form-urlencoded
Host: example.com
Connection: Keep-Alive
Authorization: NTLM AAABBBCCC...FFF==
data=...
나는 첫 번째 요청이 절대적으로 쓸모 없다고 생각합니다.
하지만 첫 번째 호출은 실제로 쓸모가 없으며 그와 같은 챌린지 응답이 없습니다. 내 업데이트를 참조하십시오. – rekire
핸드 셰이크는 항상 클라이언트에게 요청하여 NTLM 서버에 의해 시작됩니다. 부담없이 사양을 참조하십시오. – oleg
글쎄, 사양을 읽지는 않았지만, 그 통신을보고이 지식을 바탕으로 고객이 chellange 응답 인증에 사용되는 일종의 소금으로 시작한다고 생각합니다. 지금까지 Server가 NTLM을 지원한다고 알리는 부분은 건너 뛸 수 있다고 생각합니다. – rekire