Inicialización del modo de usuario
Las aplicaciones distribuidas (cliente/servidor) usan paquetes de seguridad para obtener conexiones autenticadas y intercambiar mensajes. La aplicación llama a funciones de interfaz del proveedor de compatibilidad de seguridad (SSPI) que se asignan a las funciones implementadas por SSP/AP, y las funciones implementadas por SSP/AP en modo de usuario. Esta asignación la realiza el archivo DLL del proveedor de seguridad (Secur32.dll o Security.dll), que se puede cargar dinámicamente en el cliente y el servidor. El archivo DLL también se puede vincular estáticamente mediante Secur32.lib. Tanto el archivo DLL como lib se incluyen con el Kit de desarrollo de software (SDK) de Microsoft Windows.
El sistema controla la carga del paquete de seguridad en el proceso del cliente o servidor, si el archivo DLL de SSP/AP que contiene el paquete de seguridad está registrado correctamente.
El servidor comienza el proceso de obtener una conexión segura con un cliente mediante la supervisión de un puerto, esperando a que un cliente envíe un mensaje. El cliente comienza el proceso de obtener una conexión segura al servidor mediante una llamada a la función SSPI InitializeSecurityContext (General). Esta función se asigna a la función SpInitLsaModeContext del paquete de seguridad personalizado. SpInitLsaModeContext devuelve un token al cliente, que lo reenvía al servidor.
Al recibir el token del cliente, el servidor llama a la función AcceptSecurityContext (General) de SSPI, que se envía a la función SpAcceptLsaModeContext del paquete de seguridad. Si la función SpAcceptLsaModeContext se realiza correctamente y no se requiere más procesamiento para establecer el contexto de seguridad, la función debe devolver STATUS_SUCCESS al autor de la llamada. Si se requiere procesamiento adicional, la función debe devolver SEC_I_CONTINUE_NEEDED y devolver un token al servidor. El servidor reenvía el token al cliente, que llama a InitializeSecurityContext (General) de nuevo.
Este ciclo de llamada se puede repetir con tanta frecuencia como sea necesario hasta que se establezca o se produzca un error en una conexión autenticada. Durante este proceso, si la función SpAcceptLsaModeContext o SpInitLsaModeContext se realiza correctamente y no se requiere más procesamiento para establecer el contexto de seguridad, la función debe devolver STATUS_SUCCESS al autor de la llamada. Si se requiere procesamiento adicional, la función debe devolver SEC_I_CONTINUE_NEEDED y devolver un token al autor de la llamada, que es responsable de reenviarlo.
El protocolo implementado por el paquete de seguridad determina el número de veces que se repite este ciclo. Por ejemplo, en los paquetes de seguridad que admiten la autenticación mutua de tres segmentos, la secuencia de llamada es la siguiente:
- El cliente obtiene un token llamando a InitializeSecurityContext (General) y lo envía al servidor. El servidor llama a AcceptSecurityContext (General) la primera vez y devuelve un token de respuesta que envía al cliente.
- El cliente usa el token recibido del servidor en una segunda llamada a InitializeSecurityContext (General) y devuelve un token final. El cliente envía este token al servidor.
- El servidor recibe el token generado en la etapa 2 que usa en la llamada final a AcceptSecurityContext (General).
Cuando las funciones SpAcceptLsaModeContext y SpInitLsaModeContext se realizan correctamente y no es necesario procesar más para establecer el contexto de seguridad, las funciones deben devolver STATUS_SUCCESS al autor de la llamada. Además, si el paquete de seguridad personalizado admite las funciones implementadas por SSP/AP en modo de usuario, SpAcceptLsaModeContext y SpInitLsaModeContext deben devolver TRUE mediante el parámetro MappedContext . El valor MappedContext no se devuelve a la aplicación; es interceptado por el LSA.
Cuando MappedContext es true, LSA llama a la función SpUsermodeInitialize del archivo DLL de SSP/AP. Esta función proporciona tablas de punteros a las funciones en modo de usuario implementadas por cada paquete de seguridad. Se llama a la función SpInstanceInit de cada paquete mediante las tablas de función devueltas por SpUsermodeInitialize. SpInstanceInit recibe una tabla de punteros a las funciones de LSA llamadas por SSP/AP en modo de usuario.