2012-04-30 10 views
10

estoy usando LogonUser para validar un conjunto de credenciales de dominio de un usuario.¿Cómo hacer que LogonUser no use credenciales en caché?

LogonUser(accountName, domain, password, 
     LOGON32_LOGON_NETWORK, LOGON32_PROVIDER_WINNT50, ref token); 

con resultados inquietantes:

LogonType Current Password    Old password 
=========== ============================== ======================== 
Network  Succeeds      Succeeds 
Batch  Fails (0x00000569)    Fails (invalid password) 
Interactive Succeeds      Fails (invalid password) 

códigos de falla:

  • 0x00000569: Error de inicio: el usuario no se ha concedido el tipo de inicio de sesión en este equipo
  • 0x0000052E: Error de inicio de sesión: Desconectar nown nombre de usuario o contraseña

Detalles:

  • si el usuario introduce válidos credenciales de la función devuelve true. (bueno)
  • si el usuario introduce no válidas las credenciales la función devuelve false. (buena)

  • si el usuario cambia su contraseña, y entra en sus nuevas credenciales válidos la función devuelve true. (buena)

  • si el usuario introduce no válidas las credenciales la función devuelve false. (buena)

  • si el usuario introduce sus credenciales viejos la función devuelve true. (malo)

Nota: si el usuario se mueve a una máquina diferente (uno que nunca han conectaron a antes), y entran viejos credenciales, LogonUser sigue return true. Esto significa que el almacenamiento en caché no está ocurriendo en la máquina local, pero de alguna manera "en la red".

  • si el usuario cambia su contraseña de nuevo , y entra en sus nuevas nuevas credenciales, la función devuelve true.(bueno)
  • si el usuario introduce sus credenciales viejos la función devuelve true. (malo)
  • si el usuario introduce sus viejos viejos credenciales de la función devuelve false. (buena)

Cómo, al llamar LogonUser ¿Puedo darle instrucciones para instruir el dominio de no usar credenciales almacenadas en caché .

Nota: Si el usuario intenta iniciar sesión en Windows con su edad (o edad de edad) la contraseña, consiguen error de contraseña no válido.


De MSDN:

LOGON32_LOGON_NETWORK
Este tipo de inicio de sesión está destinada a servidores de alto rendimiento para autenticar las contraseñas en texto plano. La función LogonUser no almacena en caché las credenciales para este tipo de inicio de sesión.

LOGON32_LOGON_INTERACTIVE
Este tipo de inicio de sesión está destinado a usuarios que serán interactiva utilizando el ordenador, tal como un usuario que se está conectado por un servidor terminal, alejado de la cáscara, o un proceso similar. Este tipo de inicio de sesión tiene el gasto adicional de información de inicio de sesión de almacenamiento en caché para las operaciones desconectadas; por lo tanto, es inapropiado para algunas aplicaciones cliente/servidor, como un servidor de correo.

LOGON32_LOGON_BATCH Este tipo de inicio de sesión está destinado a los servidores por lotes, donde los procesos pueden estar ejecutándose en nombre de un usuario sin su intervención directa. Este tipo también es para servidores de mayor rendimiento que procesan muchos intentos de autenticación de texto plano a la vez, como correo o servidores web.

i soy autenticación de contraseñas de texto sin formato, y por lo tanto el uso de LOGON32_LOGON_NETWORK. Interactivo credenciales de caché de inicio de sesión, que no está permitido aquí. El lote, aunque no está documentado cuando debería usarse, simplemente falla.


actualización: El dominio sólo permite:

  • la contraseña anterior (no más lejos hacia atrás)
  • por 60 minutos

Es claro para mí que es una "característica" de Active Directory que otorga un período de gracia de 1 hora.

Excepto que no quiero el período de gracia, y no quiero cambiar ninguna configuración en el dominio (ya que no conozco ninguna configuración en el dominio que permita un período de gracia de uso de una hora de su contraseña anterior).

Respuesta

4

Es una característica de NTLM. Puede cambiar el valor predeterminado 60 min. agregando un valor OldPasswordAllowedPeriod DWORD en minutos a la clave HKLM\SYSTEM\CurrentControlSet\Control\Lsa en el controlador de dominio, o puede deshabilitar la política 'Aplicar historial de contraseñas'. También puede intentar usar otro proveedor de inicio de sesión como LOGON32_PROVIDER_WINNT50.

BTW si ya proporciona una GUI, no veo ninguna desventaja al usar LOGON32_LOGON_INTERACTIVE.

+1

i * am * usando 'LOGON32_PROVIDER_WINNT50' - no deseo * utilizar * NTLM privado. Entonces, cuestionar se convierte implícitamente en "¿Cómo puedo usar Kerberos en lugar de la autenticación NTLM?". Pero la pregunta de * "¿Por qué' LogonUser' utilizando NTLM en lugar de Kerberos? "* Es una que ni StackOverflow [ni ServerFault parecen ser capaces de responder] (http://serverfault.com/questions/384719/how-to -ensure-machine-is-kerberos-domain-joined). –

Cuestiones relacionadas