有没有办法通过嗅探NTLM标头来计算出用户的名字? 我有一个应用程序访问NTLM auth’d站点,因此会打开一个Auth提示符,以便用户通过输入用户名/密码对站点进行身份验证. 有没有办法,只需
我有一个应用程序访问NTLM auth’d站点,因此会打开一个Auth提示符,以便用户通过输入用户名/密码对站点进行身份验证.
有没有办法,只需访问标题,找出输入的用户名是什么?
它甚至可能吗?
谢谢,
Jonsie
当然,即使使用简单的JSP文件也可以做到这一点……(这只适用于NTLMv1,而不是v2,我仍在寻找…)所以JSP的代码是(我在Apache Tomcat 6上尝试过)
<%@ page import="sun.misc.BASE64Encoder" %> <% String auth = request.getHeader("Authorization"); String s = ""; //no auth, request NTLM if (auth == null) { response.setStatus(response.SC_UNAUTHORIZED); response.setHeader("WWW-Authenticate", "NTLM"); return; } //check what client sent if (auth.startsWith("NTLM ")) { out.println(auth); byte[] msg = new sun.misc.BASE64Decoder().decodeBuffer(auth.substring(5)); int off = 0, length, offset; out.println("<br>"+msg); out.println("<br>"+msg[1]+" "+msg[2]+" "+msg[3]+" "+msg[4]+" "+msg[5]+" "+msg[6]+" "+msg[7]+" "+msg[8]+" "+msg[9]+" "+msg[10]+"<br>"); 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(response.SC_UNAUTHORIZED); response.setHeader("WWW-Authenticate", "NTLM " + new sun.misc.BASE64Encoder().encodeBuffer(msg1).trim()); return; } else if (msg[8] == 3) { off = 30; length = msg[off+17]*256 + msg[off+16]; offset = msg[off+19]*256 + msg[off+8]; s = new String(msg, offset, length); // print computer name // out.println(s + " "); } else return; length = msg[off+1]*256 + msg[off]; offset = msg[off+3]*256 + msg[off+2]; s = new String(msg, offset, length); //domain//out.println(s + " "); length = msg[off+9]*256 + msg[off+8]; offset = msg[off+11]*256 + msg[off+10]; s = new String(msg, offset, length); out.println("Hello <span style='position:relative; width:190;" + " height:10;filter:glow(Color=#009966,Strength=1)'>"); out.println(s + "</SPAN>"); } %>