Функция
AcceptSecurityContext() создает серверный контекст безопасности, используемый для защищенного обмена между клиентом и сервером.
Возвращает handshake-сообщения, которые сервер должен передать клиенту, и обрабатывает ответные handshake-сообщения.
SECURITY_STATUS AcceptSecurityContext(
PCredHandle phCredential,
PCtxtHandle phContext,
PSecBufferDesc pInput,
ULONG fContextReq,
ULONG TargetDataRep,
PCtxtHandle phNewContext,
PSecBufferDesc pOutput,
PULONG pfContextAttr,
PTimeStamp ptsExpiry
);
Аргументы
- phCredential
- [in] Указатель на дескриптор удостоверения клиента. Указанный дескриптор получается через запрос к функции AcquireCredentialsHandle.
- phContext
- [in] Указатель на CtxtHandle . При первом вызове, укажите NULL. При последующих - указатель на дескриптор, возвращенный в phNewContext после первого вызова к этой функции.
- fContextReq
- [in] Показывает, какой набор свойств должен поддерживать контекст. Допустимые флаги перечислены в следующей таблице:
Флаг | Описание |
ASC_REQ_REPLAY_DETECT | Защита от навязывания повторных пакетов |
ASC_REQ_SEQUENCE_DETECT | Защита от навязывания перестановок пакетов |
ASC_REQ_CONFIDENTIALITY | Конфиденциальность (шифрование) |
ASC_REQ_STREAM | Соединение потокового типа |
ASC_REQ_ALLOCATE_MEMORY | SSP отводит память для буферов. Ее необходимо освободить вызовом FreeContextBuffer |
ASC_REQ_EXTENDED_ERROR | Уведомлять другую сторону об ошибках (SSL alerts) |
ASC_REQ_CONNECTION | Неформатированные сообщения |
ASC_REQ_MUTUAL_AUTH | Взаимная аутентификация |
|
Может оказаться так, что сервер поддерживает не все из запрошенных параметров. Дальнейшие детали смотрите в описании параметра pfContextAttr
- Reserved1
- [in] Зарезервирован. Должен быть 0.
- TargetDataRep
- [in] Параметр зарезервирован для будущего использования и должен быть 0.
- pInput
- [in] указатель на структуру SecBufferDesc . При первом вызове может содержать структуру SecBuffer типа SECBUFFER_APPLICATION_PROTOCOLS с протоколами уровня приложений, используемых для согласования Application-Layer Protocol Negotiation Protocol Negotiation; данные в буфере должны содержать упакованную структуру SEC_APPLICATION_PROTOCOLS. При последующих вызовах pInput должен состоять из двух структур SecBuffer . Первый буфер должен иметь тип SECBUFFER_TOKEN, и содержать пакет, полученный от клиента. Второй буфер должен иметь тип SECBUFFER_EMPTY. В него в случае необходимости будут помещены оставшиеся необработанные входные данные с типом SECBUFFER_EXTRA, или, eсли полученное сообщение неполно (SEC_E_INCOMPLETE_MESSAGE), во втором буфере типа SECBUFFER_MISSING будет возвращен ожидаемый размер входных данных.
- Reserved2
- [in] Зарезервирован. Должен быть 0.
- phNewContext
- [in/out] Указатель на CtxtHandle . При первом вызове сюда будет помещен дескриптор нового контекста. При последующих вызовах полученный дескриптор следует передавать через параметр phContext, а в phNewContext передавать NULL
- pOutput
- [in] Указатель на структуру SecBufferDesc , содержащую SecBuffer с типом SECBUFFER_TOKEN. На выходе в этот буфер будет помещен пакет, который нужно переслать серверу. При наличии флага ASC_REQ_ALLOCATE_MEMORY этот буфер будет выделен SSPI и должен быть освобожден с помощью функции FreeContextBuffer.
- pfContextAttr
- [out] Указатель на ULONG, куда будут записаны флаги, описывающие свойства устанавливаемого контекста. Список возможных значений приведен в описании параметра fContextReq. pfContextAttr получает тот же набор флагов, с заменой префикса ASC_REQ на ASC_RET.
Warning Атрибуты безопасности не следует проверять до последнего вызова функции, возвращающего SEC_E_OK. Остальные атрибуты, такие как ASC_RET_ALLOCATED_MEMORY можно использовать после первого же вызова.
- ptsExpiry
- [out] Опционален. Указатель на структуру TimeStamp . Время жизни контекста в UTC.
Возвращаемые значения
При успешном завершении функция возвращает одно из следующих значений:
Коды возврата | Описание |
---|
SEC_E_OK | Контекст безопасности был успешно установлен. Дальнейших вызовов к этой функции не требуется. Если функция вернула данные в pOutput, их следует переслать клиенту. |
SEC_E_INCOMPLETE_MESSAGE | Данные во входном буфере неполны. Приложение должно прочитать остальные данные, и снова вызвать AcceptSecurityContext. |
SEC_I_CONTINUE_NEEDED | Клиент должен послать выходные данные клиенту и ждать ответа. Полученный ответ должен быть передан при следующем вызове в AcceptSecurityContext через параметр pInput. |
Возвращаемые значения
В случае ошибки функция возвращает одно из следующих значений:
Коды возврата | Описание |
---|
SEC_E_INVALID_TOKEN | Параметр pInput содержит неправильные входные данные. |
SEC_E_INVALID_HANDLE | Параметр phContext содержит недействительный дескриптор контекста. |
SEC_E_NO_CREDENTIALS | Предоставленное удостоверение недостоверно. |
SEC_E_UNSUPPORTED_FUNCTION | Параметр fContextReq содержит неподдерживаемый набор флагов. |
SEC_E_INSUFFICIENT_MEMORY | Один из буферов оказался слишком мал. См. заметки. |
Примечания
На стороне клиента для создания контекста используется парная функция InitializeSecurityContext.
Вызывающее приложение должно определить допустимость атрибутов установленного контекста. Например, если конфиденциальность соединения была запрошена, но не была достигнута, некоторые приложения должны принять решение немедленно прекратить соединение. Если контекст не смог быть установлен, сервер должен удалить частично созданный контекст вызовом DeleteSecurityContext.
Требования:
AIX: 5.3 или выше.
FreeBSD: 7 или выше.
Linux: LSB 3.1 (RHEL 4, SuSE 10) или выше.
Solaris: 10 или выше.
Windows 2000 или выше: Необходимо Windows 2000 SP4 или старше с Internet Explorer 6.0 или старше.
Файл описания: Прототип описан в файле sspi.h для Windows и CSP_Sspi.h, CSP_SChannel.h, CpSSP.h для Unix.
См. также
AcquireCredentialsHandle() ,CtxtHandle ,DeleteSecurityContext() ,InitializeSecurityContext() ,SecBuffer ,SecBufferDesc ,FreeContextBuffer() ,TimeStamp