Функция AcceptSecurityContext (NTLM)

Функция AcceptSecurityContext (NTLM) позволяет компоненту сервера транспортного приложения установить контекст безопасности между сервером и удаленным клиентом. Удаленный клиент использует функцию InitializeSecurityContext (NTLM) для запуска процесса установления контекста безопасности. Серверу может потребоваться один или несколько маркеров ответа от удаленного клиента для завершения установки контекста безопасности.

Синтаксис

SECURITY_STATUS SEC_Entry AcceptSecurityContext(
  _In_opt_    PCredHandle    phCredential,
  _Inout_opt_ PCtxtHandle    phContext,
  _In_opt_    PSecBufferDesc pInput,
  _In_        ULONG          fContextReq,
  _In_        ULONG          TargetDataRep,
  _Inout_opt_ PCtxtHandle    phNewContext,
  _Inout_opt_ PSecBufferDesc pOutput,
  _Out_       PULONG         pfContextAttr,
  _Out_opt_   PTimeStamp     ptsTimeStamp
);

Параметры

phCredential [in, optional]

Дескриптор учетных данных сервера. Сервер вызывает функцию AcquireCredentialsHandle (NTLM) с флагом SECPKG_CRED_INBOUND или SECPKG_CRED_BOTH, установленным для получения этого дескриптора.

phContext [in, out, optional]

Указатель на структуру CtxtHandle . При первом вызове AcceptSecurityContext (NTLM) этот указатель имеет значение NULL. При последующих вызовах phContext — это дескриптор частично сформированного контекста, возвращенного в параметре phNewContext первым вызовом.

pInput [in, optional]

Указатель на структуру SecBufferDesc , созданную вызовом клиента InitializeSecurityContext (NTLM), которая содержит дескриптор входного буфера.

Сведения о привязке канала можно указать, передав структуру SecBuffer типа SECBUFFER_CHANNEL_BINDINGS в дополнение к буферам, созданным вызовом функции InitializeSecurityContext (General). Сведения о привязке канала для буфера привязки канала можно получить путем вызова функции QueryContextAttributes (Schannel) в контексте Schannel , используемого клиентом для проверки подлинности.

fContextReq [in]

Битовые флаги, указывающие атрибуты, необходимые серверу для установления контекста. Битовые флаги можно объединять с помощью побитовых операций ИЛИ . Этот параметр может быть одним или несколькими из следующих значений.

Значение Значение
ASC_REQ_CONFIDENTIALITY
Шифрование и расшифровка сообщений.
ASC_REQ_CONNECTION
Контекст безопасности не будет обрабатывать сообщения форматирования.
ASC_REQ_EXTENDED_ERROR
При возникновении ошибок удаленная сторона будет уведомлена.
ASC_REQ_INTEGRITY
Подписывая сообщения и проверяйте подписи.
ASC_REQ_REPLAY_DETECT
Обнаружение воспроизводимых пакетов.
ASC_REQ_SEQUENCE_DETECT
Обнаружение сообщений, полученных вне последовательности.

 

Возможные флаги атрибутов и их значения см. в разделе "Требования к контексту". Флаги, используемые для этого параметра, имеют префикс ASC_REQ, например ASC_REQ_DELEGATE.

Запрошенные атрибуты могут не поддерживаться клиентом. Дополнительные сведения см. в описании параметра pfContextAttr .

TargetDataRep [in]

Представление данных, например упорядочение байтов, в целевом объекте. Этот параметр может быть либо SECURITY_NATIVE_DREP, либо SECURITY_NETWORK_DREP.

phNewContext [in, out, optional]

Указатель на структуру CtxtHandle . При первом вызове AcceptSecurityContext (NTLM) этот указатель получает новый дескриптор контекста. При последующих вызовах phNewContext может совпадать с дескриптором, указанным в параметре phContext .

pOutput [in, out, optional]

Указатель на структуру SecBufferDesc , содержащую дескриптор выходного буфера. Этот буфер отправляется клиенту для ввода дополнительных вызовов InitializeSecurityContext (NTLM). Выходной буфер может быть создан, даже если функция возвращает SEC_E_OK. Любой созданный буфер необходимо отправить обратно в клиентское приложение.

pfContextAttr [out]

Указатель на переменную, которая получает набор битовых флагов, указывающих атрибуты установленного контекста. Описание различных атрибутов см. в разделе "Требования к контексту". Флаги, используемые для этого параметра, имеют префикс ASC_RET, например ASC_RET_DELEGATE.

Не проверяйте наличие атрибутов, связанных с безопасностью, пока окончательный вызов функции не вернется успешно. Флаги атрибутов, не связанные с безопасностью, например флагом ASC_RET_ALLOCATED_MEMORY, можно проверить перед окончательным возвратом.

ptsTimeStamp [out, optional]

Указатель на структуру TimeStamp , которая получает время окончания срока действия контекста. Рекомендуется, чтобы пакет безопасности всегда возвращал это значение в местное время.

Примечание

До последнего вызова процесса проверки подлинности срок действия контекста может быть неправильным, так как дополнительные сведения будут предоставлены на последующих этапах согласования. Таким образом, ptsTimeStamp должен иметь значение NULL до последнего вызова функции.

 

Возвращаемое значение

Эта функция возвращает одно из следующих значений.

Возвращаемый код или значениеОписание
SEC_E_INSUFFICIENT_MEMORY
0x80090300L
Сбой функции. Недостаточно памяти для выполнения запрошенного действия.
SEC_E_INTERNAL_ERROR
0x80090304L
Сбой функции. Произошла ошибка, не сопоставленная с кодом ошибки SSPI.
SEC_E_INVALID_HANDLE
0x80100003L
Сбой функции. Дескриптор, переданный функции, недопустим.
SEC_E_INVALID_TOKEN
0x80090308L
Сбой функции. Недопустимый токен, переданный функции.
SEC_E_LOGON_DENIED
0x8009030CL
Сбой входа.
SEC_E_NO_AUTHENTICATING_AUTHORITY
0x80090311L
Сбой функции. Для проверки подлинности не удается связаться с центром сертификации. Это может быть вызвано следующими условиями:
  • Неверное доменное имя проверяющей стороны.
  • Домен недоступен.
  • Отношение доверия завершилось сбоем.
SEC_E_OK
0x00000000L
Функция выполнена успешно. [*контекст безопасности*](.. /secgloss/s-gly.md) получено от клиента. Если выходной токен был создан функцией, его необходимо отправить в клиентский процесс.
SEC_I_COMPLETE_AND_CONTINUE
0x00090314L
Функция выполнена успешно. Сервер должен вызвать [CompleteAuthToken](/windows/win32/api/sspi/nf-sspi-completeauthtoken) и передать выходной маркер клиенту. Затем сервер ожидает маркера возврата от клиента, а затем выполняет еще один вызов [AcceptSecurityContext (NTLM)](acceptsecuritycontext--ntlm.md).
SEC_I_COMPLETE_NEEDED
0x00090313L
Функция выполнена успешно. Сервер должен завершить сборку сообщения от клиента, а затем вызвать функцию [CompleteAuthToken](/windows/win32/api/sspi/nf-sspi-completeauthtoken).
SEC_I_CONTINUE_NEEDED
0x00090312L
Функция выполнена успешно. Сервер должен отправить выходной маркер клиенту и дождаться возвращенного маркера. Возвращенный маркер должен передаваться в pInput для другого вызова [AcceptSecurityContext (NTLM)](acceptsecuritycontext--ntlm.md).

 

Комментарии

Функция AcceptSecurityContext (NTLM) является аналогом сервера функции InitializeSecurityContext (NTLM).

Когда сервер получает запрос от клиента, сервер использует параметр fContextReq , чтобы указать, что требуется для сеанса. Таким образом, сервер может указать, что клиенты должны использовать конфиденциальный или проверенный сеанс целостности, и может отклонить клиентов, которые не могут соответствовать этому требованию. Кроме того, сервер не может требовать ничего, и все, что клиент может предоставить или требует, возвращается в параметре pfContextAttr .

Для пакета, поддерживающего многоуровневую проверку подлинности, например взаимную проверку подлинности, последовательность вызовов выглядит следующим образом:

  1. Клиент передает маркер серверу.
  2. Сервер впервые вызывает AcceptSecurityContext (NTLM), который создает маркер ответа, который затем отправляется клиенту.
  3. Клиент получает маркер и передает его в InitializeSecurityContext (NTLM). Если InitializeSecurityContext (NTLM) возвращает SEC_E_OK, взаимная проверка подлинности завершена и может начаться безопасный сеанс. Если InitializeSecurityContext (NTLM) возвращает код ошибки, согласование взаимной проверки подлинности завершается. В противном случае маркер безопасности, возвращенный InitializeSecurityContext (NTLM), отправляется клиенту, а шаги 2 и 3 повторяются.

Параметры fContextReq и pfContextAttr представляют собой битовые маски, представляющие различные атрибуты контекста. Описание различных атрибутов см. в разделе "Требования к контексту".

Примечание

Параметр pfContextAttr действителен при любом успешном возвращении, но только после окончательного успешного возврата следует изучить флаги, относящиеся к аспектам безопасности контекста. Промежуточные возвращаемые значения могут задавать, например, флаг ISC_RET_ALLOCATED_MEMORY.

 

Вызывающий объект отвечает за определение достаточности конечных атрибутов контекста. Например, если запрашивалось конфиденциальность (шифрование), но не удалось установить, некоторые приложения могут немедленно завершить подключение. Если не удается установить контекст безопасности , сервер должен освободить частично созданный контекст, вызвав функцию DeleteSecurityContext . Сведения о том, когда следует вызывать функцию DeleteSecurityContext , см. в разделе DeleteSecurityContext.

После установки контекста безопасности серверное приложение может использовать функцию QuerySecurityContextToken для получения дескриптора учетной записи пользователя, с которой сопоставлен сертификат клиента. Кроме того, сервер может использовать функцию ImpersonateSecurityContext для олицетворения пользователя.

Требования

Требование Значение
Минимальная версия клиента
Windows XP [только классические приложения]
Минимальная версия сервера
Windows Server 2003 [только классические приложения]
Заголовок
Sspi.h (include Security.h)
Библиотека
Secur32.lib
DLL
Secur32.dll

См. также раздел

Функции SSPI

DeleteSecurityContext

InitializeSecurityContext (NTLM)