Функция ИнициализацияSecurityContext (NTLM)
Функция InitializeSecurityContext (NTLM) инициирует исходящий контекст безопасности на стороне клиента из дескриптора учетных данных. Функция используется для создания контекста безопасности между клиентским приложением и удаленным одноранговым узлом. InitializeSecurityContext (NTLM) возвращает маркер, который клиент должен передать удаленному одноранговому узлу, который одноранговый узел, в свою очередь, отправляет в локальную реализацию безопасности через вызов AcceptSecurityContext (NTLM). Созданный маркер должен считаться непрозрачным для всех вызывающих.
Обычно функция InitializeSecurityContext (NTLM) вызывается в цикле, пока не будет установлен достаточный контекст безопасности .
Синтаксис
SECURITY_STATUS SEC_Entry InitializeSecurityContext(
_In_opt_ PCredHandle phCredential,
_In_opt_ PCtxtHandle phContext,
_In_ SEC_CHAR *pszTargetName,
_In_ ULONG fContextReq,
_In_ ULONG Reserved1,
_In_ ULONG TargetDataRep,
_In_opt_ PSecBufferDesc pInput,
_In_ ULONG Reserved2,
_Inout_opt_ PCtxtHandle phNewContext,
_Inout_opt_ PSecBufferDesc pOutput,
_Out_ PULONG pfContextAttr,
_Out_opt_ PTimeStamp ptsExpiry
);
Параметры
phCredential[in, optional]
Дескриптор учетных данных, возвращенных AcquireCredentialsHandle (NTLM). Этот дескриптор используется для создания контекста безопасности. Для функции InitializeSecurityContext (NTLM) требуются по крайней мере учетные данные OUTBOUND.
phContext[in, optional]
Указатель на структуру CtxtHandle . При первом вызове Метода InitializeSecurityContext (NTLM) этот указатель имеет значение NULL
. Во втором вызове этот параметр является указателем на дескриптор частично сформированного контекста, возвращаемого в параметре phNewContext при первом вызове.
Предупреждение
Не используйте один и тот же дескриптор контекста в параллельных вызовах InitializeSecurityContext (NTLM). Реализация API в поставщиках служб безопасности не является потокобезопасной.
pszTargetName[in]
Указатель на строку, завершающуюся значением NULL, которая указывает имя субъекта-службы (SPN) или контекст безопасности целевого сервера.
Приложения должны предоставлять допустимое имя субъекта-службы, чтобы предотвратить атаки на воспроизведение.
Используйте полное целевое имя, так как короткие имена не поддерживаются в лесах.
fContextReq[in]
Битовые флаги, указывающие запросы для контекста. Не все пакеты могут поддерживать все требования. Флаги, используемые для этого параметра, имеют префикс ISC_REQ_, например ISC_REQ_DELEGATE. Этот параметр может быть одним или несколькими из следующих флагов атрибутов.
Значение | Значение |
---|---|
ISC_REQ_ALLOCATE_MEMORY | Пакет безопасности выделяет выходные буферы. Завершив использование буферов вывода, освободите их, вызвав функцию FreeContextBuffer . |
ISC_REQ_CONFIDENTIALITY | Шифруйте сообщения с помощью функции EncryptMessage . |
ISC_REQ_CONNECTION | Контекст безопасности не будет обрабатывать сообщения форматирования. Это значение по умолчанию. |
ISC_REQ_EXTENDED_ERROR | При возникновении ошибок удаленная сторона будет уведомлена. |
ISC_REQ_INTEGRITY | Подписывая сообщения и проверяя подписи с помощью функций EncryptMessage и MakeSignature . |
ISC_REQ_MUTUAL_AUTH | Политика взаимной проверки подлинности службы будет удовлетворена. ОСТОРОЖНОСТЬЮ: Это не обязательно означает, что выполняется взаимная проверка подлинности, а только то, что политика проверки подлинности службы удовлетворена. Чтобы обеспечить выполнение взаимной проверки подлинности, вызовите функцию QueryContextAttributes (NTLM). |
ISC_REQ_REPLAY_DETECT | Обнаружение воспроизведенных сообщений, которые были закодированы с помощью функций EncryptMessage или MakeSignature . |
ISC_REQ_SEQUENCE_DETECT | Обнаружение сообщений, полученных вне последовательности. |
ISC_REQ_STREAM | Поддержка потокового подключения. |
Запрошенные атрибуты могут не поддерживаться клиентом. Дополнительные сведения см. в параметре pfContextAttr .
Дополнительные описания различных атрибутов см. в разделе Требования к контексту.
Зарезервировано1[in]
Этот параметр зарезервирован и должен иметь нулевое значение.
TargetDataRep[in]
Представление данных, например порядок байтов, в целевом объекте. Этот параметр может быть либо SECURITY_NATIVE_DREP, либо SECURITY_NETWORK_DREP.
pInput[in, optional]
Указатель на структуру SecBufferDesc , содержащую указатели на буферы, предоставленные в качестве входных данных для пакета. Если контекст клиента не был инициирован сервером, значение этого параметра должно быть NULL
при первом вызове функции. При последующих вызовах функции или при инициировании контекста клиента сервером значение этого параметра является указателем на буфер, выделенный с достаточным объемом памяти для хранения маркера, возвращенного удаленным компьютером.
Зарезервировано2[in]
Этот параметр зарезервирован и должен иметь нулевое значение.
phNewContext[in, out, optional]
Указатель на структуру CtxtHandle . При первом вызове Метода InitializeSecurityContext (NTLM) этот указатель получает новый дескриптор контекста. Во втором вызове phNewContext может совпадать с дескриптором, указанным в параметре phContext .
PhNewContext никогда не должен иметь значение NULL
.
pOutput[in, out, optional]
Указатель на структуру SecBufferDesc , содержащую указатели на структуру SecBuffer , которая получает выходные данные. Если буфер был введен как SEC_READWRITE во входных данных, он будет там на выходе. Система выделит буфер для маркера безопасности при запросе (через ISC_REQ_ALLOCATE_MEMORY) и заполнит адрес в дескрипторе буфера для маркера безопасности.
pfContextAttr[out]
Указатель на переменную для получения набора битовых флагов, указывающих атрибуты установленного контекста. Описание различных атрибутов см. в разделе Требования к контексту.
Флаги, используемые для этого параметра, имеют префикс ISC_RET, например ISC_RET_DELEGATE. Список допустимых значений см. в параметре fContextReq .
Не проверка атрибутов, связанных с безопасностью, до тех пор, пока не будет успешно выполнен окончательный вызов функции. Флаги атрибутов, не связанные с безопасностью, такие как флаг ASC_RET_ALLOCATED_MEMORY, можно проверить перед окончательным возвратом.
Примечание
Определенные атрибуты контекста могут изменяться во время согласования с удаленным одноранговым узлом.
ptsExpiry[out, optional]
Указатель на структуру TimeStamp , которая получает время окончания срока действия контекста. Рекомендуется, чтобы пакет безопасности всегда возвращал это значение в местное время. Этот параметр является необязательным, и для клиентов с коротким сроком действия необходимо передать ЗНАЧЕНИЕ NULL .
Возвращаемое значение
Если функция завершается успешно, функция возвращает один из следующих кодов успешного выполнения.
Код возврата | Описание |
---|---|
SEC_E_OK | Контекст безопасности успешно инициализирован. Другой вызов InitializeSecurityContext (NTLM) не требуется. Если функция возвращает выходной маркер, т. е. если SECBUFFER_TOKEN в pOutput имеет ненулевое значение длины, этот маркер должен быть отправлен на сервер. |
SEC_I_COMPLETE_AND_CONTINUE | Клиент должен вызвать CompleteAuthToken , а затем передать выходные данные на сервер. Затем клиент ожидает возвращенного маркера и передает его в другом вызове в InitializeSecurityContext (NTLM). |
SEC_I_COMPLETE_NEEDED | Клиент должен завершить построение сообщения, а затем вызвать функцию CompleteAuthToken . |
SEC_I_CONTINUE_NEEDED | Клиент должен отправить выходной маркер на сервер и дождаться возврата маркера. Затем возвращенный маркер передается в другом вызове Метода InitializeSecurityContext (NTLM). Выходной маркер может быть пустым. |
Если функция завершается сбоем, функция возвращает один из следующих кодов ошибок.
Код возврата | Описание |
---|---|
SEC_E_INSUFFICIENT_MEMORY | Недостаточно памяти для выполнения запрошенного действия. |
SEC_E_INTERNAL_ERROR | Произошла ошибка, не сопоставленная с кодом ошибки SSPI. |
SEC_E_INVALID_HANDLE | Дескриптор, переданный функции, недопустим. |
SEC_E_INVALID_TOKEN | Ошибка возникает из-за неправильного формата входного маркера, например маркера, поврежденного при передаче, маркера неправильного размера или маркера, переданного в неправильное ограниченное делегирование. Передача маркера в неправильный пакет может произойти, если клиент и сервер не согласовывали правильное ограниченное делегирование. |
SEC_E_LOGON_DENIED | Сбой входа. |
SEC_E_NO_AUTHENTICATING_AUTHORITY | Невозможно связаться с центром для проверки подлинности. Доменное имя стороны, проверяющей подлинность, может быть неправильным, домен может быть недостижим или произошел сбой отношения доверия. |
SEC_E_NO_CREDENTIALS | В ограниченном делегировании учетные данные недоступны. |
SEC_E_TARGET_UNKNOWN | Целевой объект не распознался. |
SEC_E_UNSUPPORTED_FUNCTION | Недопустимый флаг атрибута контекста (ISC_REQ_DELEGATE или ISC_REQ_PROMPT_FOR_CREDS) был указан в параметре fContextReq . |
SEC_E_WRONG_PRINCIPAL | Субъект, получивший запрос проверки подлинности, не совпадает с тем, который передается в параметр pszTargetName . Это указывает на сбой во взаимной проверке подлинности. |
Комментарии
Вызывающий объект отвечает за определение того, достаточно ли конечных атрибутов контекста. Например, если была запрошена конфиденциальность, но ее не удалось установить, некоторые приложения могут немедленно завершить подключение.
Если атрибутов контекста безопасности недостаточно, клиент должен освободить частично созданный контекст, вызвав функцию DeleteSecurityContext .
Функция NTLM (InitializeSecurityContext) используется клиентом для инициализации исходящего контекста.
Для двухуровневого контекста безопасности последовательность вызовов выглядит следующим образом:
- Клиент вызывает функцию с параметром
NULL
phContext и заполняет дескриптор буфера входным сообщением. - Пакет безопасности проверяет параметры и создает непрозрачный маркер, помещая его в элемент TOKEN в буферном массиве. Если параметр fContextReq включает флаг ISC_REQ_ALLOCATE_MEMORY, пакет безопасности выделяет память и возвращает указатель в элементе TOKEN.
- Клиент отправляет маркер, возвращенный в буфере pOutput , на целевой сервер. Затем сервер передает маркер в качестве входного аргумента в вызове функции AcceptSecurityContext (NTLM).
- AcceptSecurityContext (NTLM) может вернуть маркер, который сервер отправляет клиенту для второго вызова Метода InitializeSecurityContext (NTLM), если первый вызов вернул SEC_I_CONTINUE_NEEDED.
Для многоуровневых контекстов безопасности, таких как взаимная проверка подлинности, последовательность вызовов выглядит следующим образом:
- Клиент вызывает функцию, как описано выше, но пакет возвращает SEC_I_CONTINUE_NEEDED код успешного выполнения.
- Клиент отправляет выходной маркер серверу и ожидает ответа сервера.
- После получения ответа сервера клиент снова вызывает InitializeSecurityContext (NTLM), при этом для параметра phContext задан дескриптор, возвращенный из последнего вызова. Маркер, полученный от сервера, предоставляется в параметре pInput .
- Не используйте значение phContext в параллельных вызовах InitializeSecurityContext (NTLM). Реализация в поставщиках безопасности не является потокобезопасной.
Если сервер успешно ответил, пакет безопасности возвращает SEC_E_OK и устанавливается безопасный сеанс.
Если функция возвращает один из ответов об ошибке, ответ сервера не принимается и сеанс не устанавливается.
Если функция возвращает SEC_I_CONTINUE_NEEDED, SEC_I_COMPLETE_NEEDED или SEC_I_COMPLETE_AND_CONTINUE, шаги 2 и 3 повторяются.
Для инициализации контекста безопасности может потребоваться несколько вызовов этой функции в зависимости от базового механизма проверки подлинности, а также вариантов, указанных в параметре fContextReq .
Параметры fContextReq и pfContextAttributes представляют собой битовые маски, представляющие различные атрибуты контекста. Описание различных атрибутов см. в разделе Требования к контексту. Параметр pfContextAttributes действителен при любом успешном возвращении, но только при окончательном успешном возвращении, если вы изучите флаги, относящиеся к аспектам безопасности контекста. Промежуточные возвраты могут задавать, например, флаг ISC_RET_ALLOCATED_MEMORY.
Если установлен флаг ISC_REQ_USE_SUPPLIED_CREDS, пакет безопасности должен искать SECBUFFER_PKG_PARAMS тип буфера во входном буфере pInput . Это не универсальное решение, но оно позволяет при необходимости надежно связывать пакет безопасности и приложение.
Если указан ISC_REQ_ALLOCATE_MEMORY, вызывающий объект должен освободить память, вызвав функцию FreeContextBuffer .
Например, входной маркер может быть запросом от диспетчера локальной сети. В этом случае выходным токеном будет зашифрованный NTLM ответ на запрос.
Действие, которое выполняет клиент, зависит от кода возврата этой функции. Если код возврата SEC_E_OK, второй вызов InitializeSecurityContext (NTLM) не будет выполняться, и ответ от сервера не ожидается. Если код возврата SEC_I_CONTINUE_NEEDED, клиент ожидает маркер в ответ от сервера и передает его во втором вызове InitializeSecurityContext (NTLM). Код возврата SEC_I_COMPLETE_NEEDED указывает, что клиент должен завершить создание сообщения и вызвать функцию CompleteAuthToken . Код SEC_I_COMPLETE_AND_CONTINUE включает оба этих действия.
Если InitializeSecurityContext (NTLM) возвращает успешное выполнение при первом (или только) вызове, то вызывающий объект должен в конечном итоге вызвать функцию DeleteSecurityContext для возвращенного дескриптора, даже если вызов завершается ошибкой на более позднем этапе обмена проверкой подлинности.
После успешного завершения клиент может снова вызвать Метод InitializeSecurityContext (NTLM ). Это указывает пакету безопасности на то, что требуется повторная проверку подлинности.
Вызывающие объекты режима ядра имеют следующие отличия: целевое имя — это строка Юникода , которая должна быть выделена в виртуальной памяти с помощью VirtualAlloc; Он не должен быть выделен из пула. Буферы, переданные и предоставленные в pInput и pOutput , должны находиться в виртуальной памяти, а не в пуле.
Требования
Требование | Значение |
---|---|
Минимальная версия клиента | Windows XP [только классические приложения] |
Минимальная версия сервера | Windows Server 2003 [только классические приложения] |
Заголовок | Sspi.h (включая Security.h) |
Библиотека | Secur32.lib |
DLL | Secur32.dll |