Autenticación Integrada de Windows

Este término se utiliza para designar las conexiones autenticadas automáticamente entre Microsoft Internet Information Services (IIS), Internet Explorer y otras aplicaciones conectadas al Directorio Activo.

También se conoce como autenticación negociada http, autenticación NT, autenticación NTLM, autenticación de dominio, autenticación integrada de Windows o simplemente autenticación de Windows.

La autenticación integrada de Windows utiliza características de seguridad entre clientes y servidores. A diferencia de otros tipos de autenticación (como la Basic o la Digest), inicialmente no le pide al usuario su identificador ni su contraseña. La información actual de identidad del usuario en el ordenador cliente es suministrada al servidor a través del navegador mediante un intercambio de datos codificado.

Si este intercambio de autenticación falla por alguna razón, el navegador puede pedir al usuario su identificación y contraseña.

La autenticación integrada de Windows no es un estándar ni tampoco un protocolo de autenticación. Internamente se apoya en protocolos tales como Kerberos, NTLMSSP o SPNEGO para realizarla.

La autenticación integrada de Windows ha sido llevada también a herramientas que se ejecutan en otros sistemas operativos como UNIX, Linux o Mac OSX.

Su utilización es especialmente conveniente en intranets donde por lo general todos los clientes se encuentran en un mismo dominio.




Intercambio NTLM (NTLM Handshake)

  1. El cliente (navegador) realiza una petición GET al servidor.

  1. El servidor de aplicaciones responde con un código 401 indicando que el cliente no está autorizado a ver la página solicitada.



El servidor Web (que ejecuta el sitio Web) cree que el flujo de datos HTTP enviado por el cliente es correcto, pero el acceso al recurso URL requiere autenticación de usuario, que:


  • No fue provista
  • Fue provista, pero no superó las pruebas de autorización.


Esto se conoce comúnmente como "Autenticación básica de HTTP". La solicitud de autenticación real esperada del cliente se define en el protocolo HTTP como el campo de cabecera WWW-Authenticate.

Generalmente, este mensaje de error significa que usted tiene primero que iniciar sesión (ingresar un usuario y contraseña válidos) en algún lugar. Si los acaba de ingresar e inmediatamente ve un error 401, esto quiere decir que el usuario, la contraseña o ambos son inválidos por alguna razón (ingresados incorrectamente, usuario suspendido, etc.)

     3. El navegador responde entonces con un mensaje tipo 1 codificado en base 64 indicando el nombre de la máquina (nombre de host) y el dominio donde se está ejecutando.



Los nombres del host y del dominio van en mayúsculas y el nombre del host solo contiene el nombre de la máquina. Por ejemplo, si el nombre totalmente cualificado es estacion00.dominio.com solo vendrá informado estacion00.

  1. El servidor de aplicaciones responde nuevamente con un error 401 de autorización, pero añadiendo además un mensaje tipo 2 codificado en base 64 denominado desafío NTLM (NTLM Challenge).


Este mensaje contiene un parámetro denominado “server nonce” que será utilizado por el cliente para crear la respuesta NTLM o LanManager y consiste en un arreglo de 8 bytes arbitrarios.

5. El cliente responde al servidor con GET enviando un mensaje tipo 3 codificado en base 64.


Este mensaje contiene el nombre de usuario, el nombre del host, el nombre de dominio y dos respuestas, una del LanManager y otra NTLM ambas codificadas con un hash utilizando el parámetro “server nonce” enviado en el paso anterior.

  1. Finalmente el servidor, tras decodificar y validar las respuestas del cliente, responde con un código http 200.


Escenario de implementación

Se tiene un servidor de aplicaciones ejecutándose sobre UNIX con una aplicación de páginas Web JSP con clientes en una red local (intranet) conectados a un dominio de directorio activo. Se necesita conocer los usuarios de Windows para dentro de la aplicación Web autorizar determinados roles.



Componente
Descripción
Primary Domain Controller (PDC)
Controlador principal de dominio (PDC) donde se registran y autentican todos los usuarios que inician sesión en los ordenadores de la red local (intranet)
Ordenadores de la red local
Puestos de trabajo de escritorio o portátiles conectados al controlador principal de dominio. Los usuarios abren sesión en estos puestos autenticándose contra el dominio de Directorio Activo. Estos ordenadores ejecutan un sistema operativo de Microsoft (Windows XP/ Windows Vista/Windows 7)
Servidores UNIX
Servidores de aplicación que ejecutan aplicaciones JSP (aplicaciones Web dinámicas). Estos servidores de aplicación se ejecutan sobre algún sabor de UNIX (Solaris, FreeBSD, Suse, RedHat o AIX)

Creación de la clase WindowsUser
  1. /** 
  2.  *  
  3.  */  
  4. package com.windowsuser;  
  5.   
  6. import javax.servlet.http.*;  
  7. /** 
  8.  * @author Jose Manuel Ayala Wilson 
  9.  * @version 0.1 
  10.  * @since 26/09/2012  
  11.  */  
  12. public class WindowsUser {  
  13.       
  14.     private String windowsDomain = "";  
  15.     private String windowsUser = "";  
  16.     private String windowsHost = "";  
  17.          
  18.     public WindowsUser(HttpServletResponse response,HttpServletRequest request)  
  19.     {  
  20.         String auth = request.getHeader("Authorization");   
  21.   
  22.         try  
  23.         {  
  24.               
  25.            if (auth == null) {  
  26.                response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);  
  27.                response.setHeader("WWW-Authenticate""NTLM");  
  28.                response.flushBuffer();  
  29.                return;  
  30.            }  
  31.   
  32.            if (auth.startsWith("NTLM ")) {   
  33.                byte[] msg = new sun.misc.BASE64Decoder().decodeBuffer(auth.substring(5));  
  34.                int off = 0, length, offset; char a = 0char b = 32;   
  35.                String s;  
  36.                   
  37.             switch(msg[8])  
  38.             {  
  39.             case 1// Client to Server GET .. Authorization:NTLM <base64-encoded type-1 msg>  
  40.               
  41.                 off = 18;  
  42.                 byte z = 0;  
  43.                 byte[] msg1 = {(byte)'N', (byte)'T', (byte)'L', (byte)'M', (byte)'S', (byte)'S', (byte)'P', z,  
  44.                                (byte)2, z, z, z, z, z, z, z,  
  45.                                (byte)40, z, z, z, (byte)1, (byte)130, z, z, z,  
  46.                                (byte)2, (byte)2, (byte)2, z, z, z, z,   
  47.                                 z, z, z, z, z, z, z, z};  
  48.                   
  49.                 response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);  
  50.                 String s1 = new sun.misc.BASE64Encoder().encodeBuffer(msg1);  
  51.                 response.setHeader("WWW-Authenticate""NTLM " + s1.trim());  
  52.                 response.flushBuffer();  
  53.                 return;  
  54.                   
  55.             case 3// Client to Server GET .. Authorization:NTLM <base64-encoded type-3 msg>  
  56.               
  57.                 off = 30;  
  58.                 length = msg[off+17]*256 + msg[off+16];  
  59.                 offset = msg[off+19]*256 + msg[off+18];  
  60.                 s = new String(msg, offset, length);  
  61.                 windowsHost = s.trim().replace(a,b).replaceAll(" ","");   
  62.                   
  63.                 length = msg[off+1]*256 + msg[off];  
  64.                 offset = msg[off+3]*256 + msg[off+2];  
  65.                 s = new String(msg, offset, length);  
  66.                 windowsDomain = s.trim().replace(a,b).replaceAll(" ","");  
  67.   
  68.                 length = msg[off+9]*256 + msg[off+8];  
  69.                 offset = msg[off+11]*256 + msg[off+10];  
  70.                 s = new String(msg, offset, length);  
  71.                 windowsUser = s.trim().replace(a,b).replaceAll(" ","");  
  72.                   
  73.                 break;  
  74.                   
  75.             default// Server to Server GET .. WWW-Authenticate:NTLM <base64-encoded type-2 msg>  
  76.                 return;  
  77.             }  
  78.               
  79.          }  
  80.         }  
  81.         catch(Exception ex)  
  82.         {  
  83.           System.out.println(ex.getMessage());  
  84.         }  
  85.     
  86.     }  
  87.   
  88.     public String getWindowsDomain() {  
  89.         return windowsDomain;  
  90.     }  
  91.       
  92.     public String getWindowsUser() {  
  93.         return windowsUser;  
  94.     }  
  95.   
  96.     public String getWindowsHost() {  
  97.         return windowsHost;  
  98.     }  
  99. }  

Página JSP de pruebas
  1. <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>  
  2. <%@ page import="com.windowsuser.WindowsUser" %>      
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
  4. <html>  
  5. <head>  
  6. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
  7. <title>Windows User</title>  
  8. </head>  
  9. <%  
  10. try  
  11. {  
  12.       // Obtenemos el usuario / dominio y nombre del host remoto  
  13.       WindowsUser wu = new WindowsUser(response,request);  
  14.       // Mostramos el usuario de dominio en la pagina               
  15.       out.println("DOMINIO = " + wu.getWindowsDomain() +  
  16.                   ",USER = " +  wu.getWindowsUser() +  
  17.                   ",WINDOWS HOST =  " +  wu.getWindowsHost());  
  18. }  
  19. catch(Exception e)  
  20. {  
  21.   String msg = e.getMessage();  
  22.   if (msg != null){  
  23.       System.out.println(msg);  
  24.   }  
  25. }  
  26.   
  27. %>  
  28. <body>  
  29.      
  30. </body>  
  31. </html>  
Código del Proyecto

El código de este proyecto se puede descarga desde Google Code aquí.


Pruebas de escenario realizadas

Este código fue implementado y probado con:

  • Estaciones de trabajo Windows XP Professional
  • Navegadores Internet Explorer 8.0 / Google Chrome 10.0
  • IBM WebSphere Application Server 7.0 sobre IBM AIX 6.1 / JDK 1.6.0.0
  • IBM WebSphere Community Edition 2.1.1.4 sobre Ubuntu Linux 10.10 Maverick Meerkat / JDK 1.6.20


Bibliografía





posted under |

2 comentarios:

Anónimo dijo...

Hola, estoy creando algo similar, pero tengo muchas dudas espero y puedas apoyarme.
saludos.

kzn dijo...

Si no manejo LAN, pero accedo a mi Router y a un DVR por Red , puiedo desactivar esta autenticación de windows en las Opciones de Internet? o es mejor dejarlo activado para que los protocolos y/o servicios que se comparten los dispositivos móbiles y demás que se conectan a través de mi tourter, y que "acostumbren" usar esta autenticación, no presenten problemas.? De antemano muchas gracias por ampliar mis conocimientos.
Datos Técnicos:
Board Intel DG31PR (DDR2)
Core 2 Duo E7300
4 GB RAM (3 Usables por el OS a 32Bits)
Win7 Ultimate x 86
NAvegador Principal: Cent Browser (basado en Chrome), Firefox, I.E 8 (para cuando IE Tab no funciona)
Y otros Navegadores portavles : Chromium, Opera, Avant, etc...
Router: QPCOM QP-wr154N Configurado en Mofo Gateway.

Publicar un comentario

Entrada más reciente Entrada antigua Inicio