Inizializzazione in modalità utente
Le applicazioni distribuite (client/server) usano pacchetti di sicurezza per ottenere connessioni autenticate e scambiare messaggi. L'applicazione chiama funzioni SSPI (Security Support Provider Interface) mappate alle funzioni di implementate da SSP/APse funzioni implementate da SSP/APs in modalità utente. Questo mapping viene eseguito dalla DLL del provider di sicurezza (Secur32.dll o Security.dll), che può essere caricata nei processi client e server in modo dinamico. La DLL può anche essere collegata staticamente tramite Secur32.lib. Sia la DLL che la LIBRERIA 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 è 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 avvia il processo di recupero di una connessione sicura al server chiamando la funzione SSPI InitializeSecurityContext (Generale). Questa funzione viene mappata alla funzione spInitLsaModeContext del pacchetto di sicurezza personalizzato. SpInitLsaModeContext restituisce un token al client, che lo inoltra al server.
Dopo aver ricevuto il token dal client, il server chiama la funzione SSPI AcceptSecurityContext (Generale), che viene inviato alla funzionespAcceptLsaModeContext 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 il token al client, che chiama InitializeSecurityContext (Generale) di nuovo.
Questo ciclo di chiamata può essere ripetuto con la frequenza necessaria fino a quando non viene stabilita o non riesce una connessione autenticata. Durante questo processo, se la funzione di SpAcceptLsaModeContext o SpInitLsaModeContext ha esito positivo e non è necessaria ulteriore 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 fasi, 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 ottiene un token di risposta inviato al client.
- Il client usa il token ricevuto dal server in una seconda chiamata a InitializeSecurityContext (Generale)e ottiene un token finale. Il client invia questo token al server.
- Il server riceve il token generato nella fase 2 che usa nella chiamata finale a AcceptSecurityContext (Generale).
Quando ilspAcceptLsaModeContexte le funzioni spInitLsaModeContext hanno esito positivo e non è necessaria più 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 di implementate da SSP/APs in modalità utente, SpAcceptLsaModeContext e SpInitLsaModeContext devono restituire TRUE tramite il parametro MappedContext. Il valore di MappedContext non viene restituito all'applicazione; viene intercettata dall'LSA.
Quando MappedContext è true, LSA chiama la funzione di 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 funzioneSpInstanceInit di ogni pacchetto usando le tabelle delle funzioni restituite da SpUsermodeInitialize. SpInstanceInit riceve una tabella di puntatori alle funzioni LSA chiamate da SSP/APs in modalità utente.