Inicjowanie trybu użytkownika
Aplikacje rozproszone (klient/serwer) używają pakietów zabezpieczeń w celu uzyskania uwierzytelnionych połączeń i wymiany komunikatów. Aplikacja wywołuje funkcje interfejsu dostawcy obsługi zabezpieczeń (SSPI), które są mapowane na funkcje implementowane przez dostawcę usług udostępnionych/dostawcę usług w chmurzeoraz funkcje implementowane przez dostawcę SSP/dostawcę usług udostępnionych w trybie użytkownika. To mapowanie jest wykonywane przez bibliotekę DLL dostawcy zabezpieczeń (Secur32.dll lub Security.dll), która może być ładowana dynamicznie do procesów klienta i serwera. Biblioteka DLL może być również statycznie połączona przy użyciu biblioteki Secur32.lib. Zarówno biblioteka DLL, jak i BIBLIOTEKA LIB są dostarczane z zestawem Microsoft Windows Software Development Kit (SDK).
Ładowanie pakietu zabezpieczeń do procesu klienta lub serwera jest obsługiwane przez system, jeśli biblioteka DLL dostawcy SSP/AP zawierająca pakiet zabezpieczeń jest poprawnie zarejestrowana.
Serwer rozpoczyna proces uzyskiwania bezpiecznego połączenia z klientem przez monitorowanie portu, czekając na wysłanie komunikatu przez klienta. Klient rozpoczyna proces uzyskiwania bezpiecznego połączenia z serwerem przez wywołanie funkcji SSPI InitializeSecurityContext (ogólne). Ta funkcja jest mapowana na funkcję spInitLsaModeContext niestandardowego pakietu zabezpieczeń. SpInitLsaModeContext zwraca token do klienta, który przekazuje go do serwera.
Po otrzymaniu tokenu od klienta serwer wywołuje funkcję SSPI AcceptSecurityContext (Ogólne), która jest wysyłana do funkcjispAcceptLsaModeContext pakietu zabezpieczeń. Jeśli funkcja SpAcceptLsaModeContext powiedzie się i nie jest wymagane więcej przetwarzania w celu ustanowienia kontekstu zabezpieczeń, funkcja powinna zwrócić STATUS_SUCCESS do obiektu wywołującego. Jeśli wymagane jest dodatkowe przetwarzanie, funkcja powinna zwrócić SEC_I_CONTINUE_NEEDED i zwrócić token do serwera. Serwer przekazuje token do klienta, który ponownie wywołujeInitializeSecurityContext (ogólne).
Ten cykl wywoływania może być powtarzany tak często, jak to konieczne, dopóki uwierzytelnione połączenie nie zostanie nawiązane lub nie powiedzie się. W trakcie tego procesu, jeśli funkcja SpAcceptLsaModeContext lub SpInitLsaModeContext zakończy się pomyślnie i nie jest wymagane więcej przetwarzania w celu ustanowienia kontekstu zabezpieczeń , funkcja powinna zwrócić STATUS_SUCCESS do obiektu wywołującego. Jeśli wymagane jest dodatkowe przetwarzanie, funkcja powinna zwrócić SEC_I_CONTINUE_NEEDED i zwrócić token do wywołującego, który jest odpowiedzialny za przekazywanie go.
Protokół implementowany przez pakiet zabezpieczeń określa liczbę powtórzeń tego cyklu. Na przykład w pakietach zabezpieczeń, które obsługują uwierzytelnianie wzajemne z trzema elementami, sekwencja wywołująca jest następująca:
- Klient uzyskuje token, wywołując InitializeSecurityContext (ogólne)i wysyła go do serwera. Serwer wywołuje AcceptSecurityContext (Ogólne) po raz pierwszy i pobiera token odpowiedzi, który wysyła do klienta.
- Klient używa tokenu odebranego z serwera w drugim wywołaniu, aby InitializeSecurityContext (ogólne)i pobiera z powrotem końcowy token. Klient wysyła ten token do serwera.
- Serwer otrzymuje token wygenerowany w punkcie 2, którego używa w ostatnim wywołaniu do AcceptSecurityContext (ogólne).
Gdy funkcje SpAcceptLsaModeContext i SpInitLsaModeContext kończą się powodzeniem i nie jest wymagane więcej przetwarzania w celu ustalenia kontekstu zabezpieczeń, funkcje powinny zwrócić STATUS_SUCCESS do obiektu wywołującego. Ponadto jeśli niestandardowy pakiet zabezpieczeń obsługuje funkcje implementowane przez dostawcę SSP/APs w trybie użytkownika, SpAcceptLsaModeContext i SpInitLsaModeContext musi zwrócić true za pomocą parametru MappedContext. Wartość MappedContext nie jest przekazywana z powrotem do aplikacji; jest przechwycony przez LSA.
Gdy mappedContext jest true, LSA wywołuje funkcję spUsermodeInitialize dostawcy usług udostępnionych/AP DLL. Ta funkcja udostępnia tabele wskaźników do funkcji trybu użytkownika implementowanych przez każdy pakiet zabezpieczeń. Każda funkcja spInstanceInit pakietu jest wywoływana przy użyciu tabel funkcji zwracanych przez SpUsermodeInitialize. spInstanceInit odbiera tabelę wskaźników w celu funkcji LSA wywoływanych przez dostawcę SSP/dostawcę usług udostępnionych w trybie użytkownika.