Initialisation en mode utilisateur

Les applications distribuées (client/serveur) utilisent des packages de sécurité pour obtenir des connexions authentifiées et échanger des messages. L’application appelle des fonctions DSPI (Security Support Provider Interface) qui sont mappées à des fonctions implémentées par SSP/APs, et des fonctions implémentées par des SSP/APs en mode utilisateur. Ce mappage est effectué par la DLL du fournisseur de sécurité (Secur32.dll ou Security.dll), qui peut être chargée dynamiquement dans les processus client et serveur. La DLL peut également être liée de manière statique à l’aide de Secur32.lib. La DLL et lib sont livrées avec le Kit de développement logiciel (SDK) Microsoft Windows.

Le chargement du package de sécurité dans le processus du client ou du serveur est géré par le système, si la DLL SSP/AP qui contient le package de sécurité est correctement inscrite.

Le serveur commence le processus d’obtention d’une connexion sécurisée avec un client en surveillant un port, en attendant qu’un client envoie un message. Le client commence le processus d’obtention d’une connexion sécurisée au serveur en appelant la fonction SSPI InitializeSecurityContext (Général). Cette fonction est mappée à la fonction SpInitLsaModeContext du package de sécurité personnalisé. SpInitLsaModeContext retourne un jeton au client, qui le transfère au serveur.

Lors de la réception du jeton du client, le serveur appelle la fonction SSPI AcceptSecurityContext (Général), qui est distribuée à la fonction SpAcceptLsaModeContext du package de sécurité. Si la fonction SpAcceptLsaModeContext réussit et qu’aucun traitement supplémentaire n’est nécessaire pour établir le contexte de sécurité, la fonction doit retourner STATUS_SUCCESS à l’appelant. Si un traitement supplémentaire est nécessaire, la fonction doit retourner SEC_I_CONTINUE_NEEDED et retourner un jeton au serveur. Le serveur transfère le jeton au client, qui appelle à nouveau InitializeSecurityContext (Général).

Ce cycle d’appel peut être répété aussi souvent que nécessaire jusqu’à ce qu’une connexion authentifiée soit établie ou échoue. Au cours de ce processus, si la fonction SpAcceptLsaModeContext ou SpInitLsaModeContext réussit et qu’aucun autre traitement n’est nécessaire pour établir le contexte de sécurité, la fonction doit retourner STATUS_SUCCESS à l’appelant. Si un traitement supplémentaire est nécessaire, la fonction doit retourner SEC_I_CONTINUE_NEEDED et retourner un jeton à l’appelant, qui est chargé de le transférer.

Le protocole implémenté par le package de sécurité détermine le nombre de fois où ce cycle est répété. Par exemple, dans les packages de sécurité qui prennent en charge l’authentification mutuelle à trois jambes, la séquence d’appel est la suivante :

  1. Le client obtient un jeton en appelant InitializeSecurityContext (Général) et l’envoie au serveur. Le serveur appelle AcceptSecurityContext (Général) la première fois et récupère un jeton de réponse qu’il envoie au client.
  2. Le client utilise le jeton reçu du serveur lors d’un deuxième appel à InitializeSecurityContext (Général) et obtient un jeton final. Le client envoie ce jeton au serveur.
  3. Le serveur reçoit le jeton généré dans l’étape 2 qu’il utilise dans l’appel final à AcceptSecurityContext (Général).

Lorsque les fonctions SpAcceptLsaModeContext et SpInitLsaModeContext réussissent et qu’aucun traitement supplémentaire n’est nécessaire pour établir le contexte de sécurité, les fonctions doivent retourner STATUS_SUCCESS à l’appelant. En outre, si le package de sécurité personnalisé prend en charge les fonctions implémentées par les SSP/APs en mode utilisateur, SpAcceptLsaModeContext et SpInitLsaModeContext doivent retourner TRUE au moyen du paramètre Mappécontext . La valeur Mappécontext n’est pas renvoyée à l’application ; il est intercepté par la LSA.

Lorsque MapéContext a la valeur true, LSA appelle la fonction SpUsermodeInitialize de la DLL SSP/AP. Cette fonction fournit des tables de pointeurs vers les fonctions en mode utilisateur implémentées par chaque package de sécurité. La fonction SpInstanceInit de chaque package est appelée, à l’aide des tables de fonctions retournées par SpUsermodeInitialize. SpInstanceInit reçoit une table de pointeurs vers les fonctions LSA appelées par les fournisseurs de services/fournisseurs de services partagés en mode utilisateur.