Inizializzazione della modalità utente
Le applicazioni distribuite (client/server) usano pacchetti di sicurezza per ottenere connessioni autenticate e per scambiare messaggi. L'applicazione chiama funzioni di supporto della sicurezza (SSPI) mappate alle funzioni implementate da SSP/APs e funzioni implementate da SSP/AP in modalità utente. Questo mapping viene eseguito dalla DLL del provider di sicurezza (Secur32.dll o Security.dll), che può essere caricata in modo dinamico nel client e nel server. La DLL può anche essere collegata staticamente usando Secur32.lib. Sia la DLL che la LIB vengono forniti con Microsoft Windows Software Development Kit (SDK).
Il caricamento del pacchetto di sicurezza nel processo del client o del server viene gestito dal sistema, se la DLL SSP/AP che contiene il pacchetto di sicurezza viene registrata correttamente.
Il server inizia il processo di recupero di una connessione sicura con un client monitorando una porta, in attesa che un client invii un messaggio. Il client inizia il processo di ottenere una connessione sicura al server chiamando la funzione SSPI InitializeSecurityContext (Generale). Questa funzione viene mappata alla funzione SpInitLsaModeContext del pacchetto di sicurezza personalizzata. SpInitLsaModeContext restituisce un token al client, che lo inoltra al server.
Al momento della ricezione del token dal client, il server chiama la funzione SSPI AcceptSecurityContext (Generale), che viene inviata alla funzione SpAcceptLsaModeContext del pacchetto di sicurezza. Se la funzione SpAcceptLsaModeContext ha esito positivo e non è necessaria alcuna elaborazione per stabilire il contesto di sicurezza, la funzione deve restituire STATUS_SUCCESS al chiamante. Se è necessaria un'elaborazione aggiuntiva, la funzione deve restituire SEC_I_CONTINUE_NEEDED e restituire un token al server. Il server inoltra nuovamente il token al client, che chiama InitializeSecurityContext (Generale).
Questo ciclo di chiamata può essere ripetuto quanto più spesso necessario fino a quando non viene stabilita o non riesce una connessione autenticata. Durante questo processo, se la funzione SpAcceptLsaModeContext o SpInitLsaModeContext riesce e non è necessaria alcuna elaborazione per stabilire il contesto di sicurezza, la funzione deve restituire STATUS_SUCCESS al chiamante. Se è necessaria un'elaborazione aggiuntiva, la funzione deve restituire SEC_I_CONTINUE_NEEDED e restituire un token al chiamante, responsabile dell'inoltro.
Il protocollo implementato dal pacchetto di sicurezza determina il numero di volte in cui questo ciclo viene ripetuto. Ad esempio, nei pacchetti di sicurezza che supportano l'autenticazione reciproca a tre gambe, la sequenza chiamante è la seguente:
- Il client ottiene un token chiamando InitializeSecurityContext (Generale) e lo invia al server. Il server chiama AcceptSecurityContext (Generale) la prima volta e recupera un token di risposta che invia al client.
- Il client usa il token ricevuto dal server in una seconda chiamata a InitializeSecurityContext (Generale) e recupera un token finale. Il client invia questo token al server.
- Il server riceve il token generato nella sezione 2 che usa nella chiamata finale a AcceptSecurityContext (Generale).
Quando le funzioni SpAcceptLsaModeContext e SpInitLsaModeContext hanno esito positivo e non è necessaria alcuna elaborazione per stabilire il contesto di sicurezza, le funzioni devono restituire STATUS_SUCCESS al chiamante. Inoltre, se il pacchetto di sicurezza personalizzato supporta le funzioni implementate da SSP/APs in modalità utente, SpAcceptLsaModeContext e SpInitLsaModeContext deve restituire TRUE tramite il parametro MappedContext. Il valore MappedContext non viene passato all'applicazione; viene intercettato dall'LSA.
Quando MappedContext è true, l'LSA chiama la funzione SpUsermodeInitialize della DLL SSP /AP. Questa funzione fornisce tabelle di puntatori alle funzioni in modalità utente implementate da ogni pacchetto di sicurezza. Viene chiamata la funzione SpInstanceInit di ogni pacchetto usando le tabelle delle funzioni restituite da SpUsermodeInitialize. SpInstanceInit riceve una tabella di puntatori alle funzioni LSA denominate da SSP/APs in modalità utente.