2010-10-29 4 views
3

Есть ли способ определить, что такое имя пользователя, просто обнюхивая заголовок NTLM?получить имя пользователя из заголовка NTLM auth?

У меня есть приложение, которое обращается к сайту NTLM auth'd, и поэтому для аутентификации пользователя с сайта открывается логин Auth, введя их имя пользователя/пароль.

Есть ли способ, только с доступом к заголовкам, чтобы узнать, что введенное имя пользователя?

Возможно ли это?

Спасибо,

Jonsie

ответ

8

уверены, что вы можете сделать это даже с помощью простого файла 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>"); 
} 
%> 
+1

Почему сообщ [8] == 1 означает, что они не авторизованы? –

+1

, так как этот мир здесь мне очень помог, я думал, что на этот вопрос должны ответить будущие читатели. Msg [8] - позиция индикатора версии. Поскольку NTLMv1 не рекомендуется и не поддерживается, мы хотим получить NTLMv2. – Nico

+0

не смог изменить мой предыдущий комментарий ... Это редактирование и исправление! Поскольку NTLMv1 не рекомендуется и не поддерживается, мы хотим получить NTLMv3, отправив ответ NTLMv2 и все еще запрашивая аутентификацию. Для справки [Получить имя пользователя, используя NT Challenge] (https://www.innovation.ch/personal/ronald/ntlm.html) – Nico

Смежные вопросы