Я пытаюсь использовать аутентификацию SSPI для подключения к серверу Sql. Есть рабочий (надеюсь) пример C с FreeTds sspi.c, который использует InitializeSecurityContext.
Проблема в том, что он дважды вызывает InitializeSecurityContext. Сначала (tds_sspi_get_auth) вызывается функция, чтобы сделать авторизацию, чтобы поместить ее в пакет входа. Там имя участника службы (SPN), созданное как (используется проект JEDI JwaSspi)
FSPN := WideString(Format('MSSQLSvc/%s:%d', [FHostName, FPort]));
status := InitializeSecurityContext(@FCred, nil, PSecWChar(FSPN),
ISC_REQ_CONFIDENTIALITY or ISC_REQ_REPLAY_DETECT or ISC_REQ_CONNECTION,
0, SECURITY_NETWORK_DREP, nil, 0, @FCredCtx, @desc, attrs, @ts);
где FSPN: WideString;
Второй вызов (tds_sspi_handle_next) InitializeSecurityContext использует тот же FSPN и ответ от сервера.
status := InitializeSecurityContext(@FCred, @FCredCtx, PSecWChar(FSPN),
ISC_REQ_CONFIDENTIALITY or ISC_REQ_REPLAY_DETECT or ISC_REQ_CONNECTION,
0, SECURITY_NETWORK_DREP, @in_desc, 0, @FCredCtx, @out_desc, attrs, @ts);
Теперь сложная часть: на C SPN, созданном с asprintf
, после первого вызова InitializeSecurityContext оно изменилось (было $4D $00 $53 $00 $53 $00 ...
, после $08 $04 $01 $00 $4E ...
) и, я думаю, заменено на Digest или подобное. При таком использовании у меня есть нарушение прав доступа где-то в oleaut32.dll.