¿Cómo validar las credenciales almacenadas en caché del usuario en un dominio?

Cuando inicia sesión en Windows, sus credenciales sonen caché. Esto te permite usarinicio de sesión único. Si tuviera que navegar a otra computadora, por ejemplo:

\\hydrogen

lo haríasno se le solicitarán credenciales.

Windows tomará su:

nombre de usuario actual(hash) contraseña

e intenta autenticarte automáticamente. Lo interesante es que esto incluso funciona si su estación de trabajo no está en el dominio. Windows lo haráautomáticamente use su nombre de usuario y contraseña cuando se conecte al servidor. Y si tu:

local nombre de usuario / contraseña coincide con undominio usuario Contraseña

te dejan entrar automáticamente.

Bonita foto:

Se llamaInicio de sesión único. Usted inicia sesión en Windows una vez, y sus credenciales almacenadas en caché se usan para validarlo mientras usa otras cosas en la red.

Los navegadores también hacen esto

Chrome, Internet Explorer y Firefox también hacen una variación de esto. Si necesita iniciar sesión en un sitio web y el servidor admiteNegociación autorización, el servidor le devolverá una indicación de que debe probar las credenciales de Windows / Dominio / Kerberos del usuario:

HTTP/1.1 401 Unauthorized
Server: Microsoft-IIS/7.5
WWW-Authenticate: Negotiate
Date: Thu, 09 Jul 2015 14:35:58 GMT
Content-Length: 0

Chrome luego tomará suen caché credenciales y (después de un poco de magia intermedia) reenviarlas al servidor web:

GET http://hr.woodglue.com HTTP/1.1
Host: hr.woodglue.com
Authorization: Negotiate YIIFzwYGKwYBBQUCoIIFwzCCBb....

Microsoft habla sobre este mecanismo en Internet Explorer en el artículo anterior:

Autenticación multiplataforma basada en HTTP mediante el protocolo de negociación

El cliente llamaAcquireCredentialsHandle() yInitializeSecurityContext() con el SPN para construir el contexto de seguridad que solicita el ticket de sesión del TGS / KDC.Usted valida contra un dominio, no servidores

Un último punto que quiero mencionar es que los servidores, servidores web, estaciones de trabajo, servidores de archivos, no validan las credenciales contra unservidor, validan contra un dominiocontrolador. Tienes un nebulosobosque de muchos servidores de dominio, y uno de ellos maneja su solicitud.

En otras palabras, no valida las credenciales contra:

\\uranium (un controlador de dominio en elwoodglue.com dominio)

validar credenciales contra:

elwoodglue.com dominio

Tenemos el importante concepto de que alguien puede:

validar suen caché cartas credencialescontra un dominiosin tener que ingresar un nombre de usuario o contraseña¿Cómo puedo hacer esto?

¿Cómo puedo validar las credenciales almacenadas en caché de alguien? Como puedeI:

validar el usuarioen caché cartas credencialescontra undominiosin el usuario tiene que ingresar un nombre de usuario o contraseña(es decir, utilizando las credenciales almacenadas en caché de Windows)

El punto importante es que no sé (o no me importa):

si la máquina del usuario está unida a un dominiosi la máquina del usuario está unida a un grupo de trabajosi la máquina del usuario está unida a lawoodglue.com o algún otro dominio (p. ej.superglue.com)los nombres de los servidores que alimentan elsuperglue.com dominio

No se como hacerlo.
No sé qué tecnologías API están involucradas.

Sé que hay una API llamadaInterfaz de proveedor de soporte de seguridad (SSPI) Esto es lo que poderesWWW-Authenticate: Negotiate (aunque no sé si es lo que alimenta a SMB desde una PC sin dominio unido).

El código abierto de Chromium podría comenzar con un fragmento de suhttp_auth_sspi_win.cc. Usan la función SSPIAcquireCredentialsHandle:

int AcquireDefaultCredentials(CredHandle* cred) 
{
   TimeStamp expiry;
   // Pass the username/password to get the credentials handle.
   // Note: Since the 5th argument is NULL, it uses the default
   // cached credentials for the logged in user, which can be used
   // for a single sign-on.
   SECURITY_STATUS status = library->AcquireCredentialsHandle(
         NULL,  // pszPrincipal
         const_cast<SEC_WCHAR*>(package),  // pszPackage
         SECPKG_CRED_OUTBOUND,  // fCredentialUse
         NULL,  // pvLogonID
         NULL,  // pAuthData
         NULL,  // pGetKeyFn (not used)
         NULL,  // pvGetKeyArgument (not used)
         cred,  // phCredential
         &expiry);  // ptsExpiry
}

Pase el nombre de usuario / contraseña para obtener el identificador de credenciales.

Nota: Dado que el quinto argumento es NULL, utiliza las credenciales almacenadas en caché predeterminadas para el usuario conectado, que se pueden usar para un inicio de sesión único.

Esta"saliente" llamar aAcquireCredentialsHandle es seguido por una llamada aInitializeSecurityContext. La idea es queInitializeSecurityContext genera una gota opaca que representa al cliente.

Luego puede realizar un conjunto paralelo de llamadas:

"entrante" llamar aAcquireCredentialsHandlellamadaAcceptSecurityContext, pasando el blob regresado antes deInitializeSecurityContext

Arobar rehostExcelente imagen de Daniel Doubrovkine:

Nota: En este caso"cliente" y"servidor" se utilizan para referirse al contexto de productor y consumidor. En mi caso el"cliente" y"servidor" Están en la misma máquina.

Pero esta línea de"muestra esfuerzo de investigación" se desmorona porque no veo ningún lugar enInitializeSecurityContext donde puedo especificarwoodglue.com como el dominio para validar contra.

Yo sé esoInitializeSecurityContext contacta a un servidor kerberos y obtiene un"boleto" gota. Ese blob de tickets se pasa al "servidor" a través deAcceptSecurityContext. A veces, el blob se puede pasar por una red; en mi caso se pasa en memoria en la misma máquina.

Pero no veo cómo especificar el servidor de dominio con el que debería estar contactandopara ese boleto

No implica que SSPI sea útil para resolver mi problema. Es solo"esfuerzo de investigación".

Esfuerzo de investigación anterior¿Qué TargetName usar al llamar a InitializeSecurityContext (Negotiate)?¿Cómo validar las credenciales de dominio (del código nativo)?¿Validar la contraseña de un usuario usando el hash?Win32: ¿Cómo validar las credenciales en Active Directory?¿Cómo realizar la autenticación de Windows?

Por supuesto, durante todo esto, si las credenciales almacenadas en caché no son válidas en el dominio especificado, tendría que pedirle al usuario un nombre de usuario y contraseña. Pero los nombres de usuario y las contraseñas son malos, la maldición de la informática, y quiero evitarlos.

estoy usando código nativo; no c#.

Respuestas a la pregunta(0)

Su respuesta a la pregunta