Поделиться через


Инициализация режима пользователя

Распределенные (клиент-серверные) приложения используют пакеты безопасности для получения подключений, прошедших проверку подлинности, и обмена сообщениями. Приложение вызывает функции интерфейса поставщика поддержки безопасности (SSPI), которые сопоставляются с функциями, реализованными поставщиком SSP/APs, и функциями, реализованными поставщиком общих служб пользовательского режима или точки доступа. Это сопоставление выполняется библиотекой DLL поставщика безопасности (Secur32.dll или Security.dll), которая может динамически загружаться в клиентские и серверные процессы. Библиотеку DLL также можно связать статически с помощью Secur32.lib. Библиотеки DLL и LIB поставляются вместе с пакетом средств разработки программного обеспечения (SDK) Microsoft Windows.

Загрузка пакета безопасности в процесс клиента или сервера обрабатывается системой, если библиотека DLL SSP/AP, содержащая пакет безопасности, правильно зарегистрирована.

Сервер начинает процесс получения безопасного соединения с клиентом, отслеживая порт и ожидая отправки клиентом сообщения. Клиент начинает процесс получения безопасного подключения к серверу, вызывая функцию SSPI InitializeSecurityContext (General) . Эта функция сопоставляется с функцией SpInitLsaModeContext пользовательского пакета безопасности. SpInitLsaModeContext возвращает маркер клиенту, который перенаправит его на сервер.

Получив маркер от клиента, сервер вызывает функцию SSPI AcceptSecurityContext (General), которая отправляется в функцию SpAcceptLsaModeContext пакета безопасности. Если функция SpAcceptLsaModeContext завершается успешно и для установки контекста безопасности больше не требуется обработка, функция должна вернуть STATUS_SUCCESS вызывающему объекту. Если требуется дополнительная обработка, функция должна вернуть SEC_I_CONTINUE_NEEDED и вернуть маркер серверу. Сервер перенаправит маркер клиенту, который снова вызывает InitializeSecurityContext (General).

Этот цикл вызова может повторяться так часто, как это необходимо, до тех пор, пока не будет установлено или не будет установлено соединение с проверкой подлинности. Если во время этого процесса функция SpAcceptLsaModeContext или SpInitLsaModeContext завершается успешно и для установки контекста безопасности обработка не требуется, функция должна вернуть STATUS_SUCCESS вызывающему объекту. Если требуется дополнительная обработка, функция должна вернуть SEC_I_CONTINUE_NEEDED и вернуть маркер вызывающему объекту, который отвечает за его пересылку.

Протокол, реализованный пакетом безопасности, определяет количество повторений этого цикла. Например, в пакетах безопасности, поддерживающих трехуровневую взаимную проверку подлинности, последовательность вызовов выглядит следующим образом:

  1. Клиент получает маркер, вызывая Метод InitializeSecurityContext (General) и отправляет его на сервер. Сервер вызывает AcceptSecurityContext (General) в первый раз и возвращает маркер ответа, который отправляет клиенту.
  2. Клиент использует маркер, полученный от сервера во втором вызове Метода InitializeSecurityContext (General), и получает окончательный маркер. Клиент отправляет этот маркер на сервер.
  3. Сервер получает маркер, созданный на этапе 2, который используется в последнем вызове AcceptSecurityContext (General) .

Если функции SpAcceptLsaModeContext и SpInitLsaModeContext завершатся успешно и для установки контекста безопасности больше не требуется обработка, функции должны возвращать STATUS_SUCCESS вызывающему объекту. Кроме того, если пользовательский пакет безопасности поддерживает функции, реализованные поставщиком SSP/APS в пользовательском режиме, spAcceptLsaModeContext и SpInitLsaModeContext должны возвращать значение TRUE с помощью параметра MappedContext . Значение MappedContext не передается обратно в приложение; он перехвачен LSA.

Если параметр MappedContext имеет значение true, LSA вызывает функцию SpUsermodeInitialize библиотеки DLL SSP/AP. Эта функция предоставляет таблицы указателей на функции пользовательского режима, реализованные каждым пакетом безопасности. Вызывается функция SpInstanceInit каждого пакета с использованием таблиц функций, возвращаемых SpUsermodeInitialize. SpInstanceInit получает таблицу указателей на функции LSA, вызываемые поставщиком общих служб в пользовательском режиме или точками управления доступом.