Java EE에서 NTLM 인증을 프로그래밍하고 있습니다. "Windows 통합 인증"이 Internet Explorer와 같이 브라우저에서 활성화되어 있으면 모든 것이 올바르게 작동합니다 (브라우저가 사용자 이름을 서버로 전송 함). 그러나 "Windows 통합 인증"이 Mozilla Firefox와 같이 비활성화 된 경우 브라우저는 사용자가 로그인 및 비밀번호를 입력해야하는 인증 양식을 표시합니다. 내 문제는 : 두 번째 경우 사용자가 로그인과 암호를 입력하면 서버 쪽에서 로그인 할 수 있지만 암호를 얻을 수 없습니다. 나는 암호를 알아야하는데, 그렇지 않으면 모든 사용자는 다른 사용자의 사용자 이름을 알고 자신의 위치에서 인증을 받아야합니다. 아래NTLM 인증 java
내 코드 :
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
/**
* NTLM
*/
String auth = request.getHeader("Authorization");
//No NTLM authentification
if (auth == null) {
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
response.setHeader("WWW-Authenticate", "NTLM");
return;
}
//check what client sent
if (auth.startsWith("NTLM")) {
byte[] msg = new sun.misc.BASE64Decoder().decodeBuffer(auth.substring(5));
int off = 0, length, offset;
if (msg[8] == 1) {
off = 18;
byte z = 0;
byte[] msg1 = {(byte) 'N', (byte) 'T', (byte) 'L', (byte) 'M', (byte) 'S',
(byte) 'S', (byte) 'P', z,
(byte) 2, z, z, z, z, z, z, z,
(byte) 40, z, z, z, (byte) 1, (byte) 130, z, z,
z, (byte) 2, (byte) 2, (byte) 2, z, z, z, z,
z, z, z, z, z, z, z, z};
// send ntlm type2 msg
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
response.setHeader("WWW-Authenticate", "NTLM " + new sun.misc.BASE64Encoder().encodeBuffer(msg1).trim());
return;
} //receive ntlm type 3 msg
else if (msg[8] == 3) {
off = 30;
//username
length = msg[off + 9] * 256 + msg[off + 8];
offset = msg[off + 11] * 256 + msg[off + 10];
username = new String(msg, offset, length);
//remoteHost
length = msg[off + 17] * 256 + msg[off + 16];
offset = msg[off + 19] * 256 + msg[off + 18];
remoteHost = new String(msg, offset, length);
//domain
length = msg[off + 1] * 256 + msg[off];
offset = msg[off + 3] * 256 + msg[off + 2];
domain = new String(msg, offset, length);
} else {
return;
}
}
/**
* END NTLM
*/
request.setAttribute("username", username);
request.setAttribute("remoteHost", remoteHost);
request.setAttribute("domain", domain);
request.setAttribute("ipAdress", request.getRemoteAddr());
request.setAttribute("remotePort", request.getRemotePort());
request.setAttribute("protocol", request.getProtocol());
this.getServletContext().getRequestDispatcher("/WEB-INF/index.jsp").forward(request, response);
NTLM 당신에게 암호를 제공하지 않을 , 그것은 도전 대응 메커니즘입니다. 분명히 J2EE 컨테이너에 NTLM 인증 프로그램이 존재합니까? 아닙니다. –
아니요 J2EE 컨테이너에 NTLM 인증 프로그램이 없으므로 일부 librairies가 있습니다. 하지만 "BROWSER 'S FORAL DIALOG"에서 "username + password"를 받고 싶습니다. " – Shakveny
수 없습니다. NTLM은 단순히 암호를 보내지 않습니다. –