ldap_sasl_bind_s (gssapi) - что должно быть предусмотрено в структуре бирвальных данных
Вопрос
Я пытаюсь использовать ldap_sasl_bind_s
Способ от Microsoft LDAP C SDK, с Gssapi. как механизм аутентификации. ldap_sasl_bind_s
ожидает учетных данных как BERVAL
структура, которая непрозрачная.
Учитывая имя пользователя (или DN) и пароль, как мне добраться до BERVAL
структура что я должен перейти к ldap_sasl_bind_s
?
Примеры, которые я нашел до сих пор
- от других LDAP C SDKS - не тот из Microsoft
- использовать
ldap_sasl_bind_s
Когда желательна простая аутентификация - но мне нужно использовать GSSAPI - использовать
ldap_sasl_interactive_bind_s
Когда другие механизмы аутентификации SASL желательны. Тем не менее, нетldap_sasl_interactive_bind_s
в Microsoft SDK.
В качестве бокового примечания цель состоит в том, чтобы иметь возможность привязать SASL к различным серверам LDAP; На данный момент: Activedirectory и OpenLDAP.
Любые указатели будут очень оценены.
Решение
Мне удалось выполнить LDAP SASL BIND OVER GSSAPI, используя ldap_sasl_bind_s
. Отказ Для тех, кто заинтересован, вот некоторые указатели.
Для абстрактного описания действий клиент и сервер должны выполнять во время аутентификации GSSAPI SASL, «Механизм аутентификации и безопасности (SASL)« Kerberos V5 («GSSAPI»). RFC следует прочитать; В частности, «Клиентская сторона аутентификации протокола Exchange» представляет интерес, поскольку он дает указание последовательности действий, которые нам необходимо выполнить для успешного привязки к серверу LDAP по Kerberos.
Учетные данные ldap_sasl_bind_s
Ожидается - их форма и их значение - зависят от фактического механизма аутентификации, который в нашем случае является Kerberos.
В Microsoft SDK Kerberos доступен через SSPI - это примерно в результате реализации Microsoft GSSAPI; Методы, которые имеют отношение к нашему конкретному случаю: AcquireCredentialsHandle
, InitializeSecurityContext
, DecryptMessage
, EncryptMessage
LDAP SASL BING ELVE OVER KERBEROS имеет 3 этапа.
Фаза 1
Вызов AcquireCredentialsHandle
а также InitializeSecurityContext
.
Важные замечания здесь:
- перейти к
AcquireCredentialsHandle
указатель наSEC_WINNT_AUTH_IDENTITY
структура, содержащая фактические учетные данные (realm, имя пользователя, пароль) илиNULL
Если учетные данные текущего потока должны использоваться - Направленное имя должно быть SPN, сопоставленным на учетную запись, под которой работает сервер LDAP
- при звонке
InitializeSecurityContext
, взаимная аутентификация должна быть запрошена.
Если все важные аргументы верны - действительные учетные данные, действительные SPN, NULL
Входной токен - InitializeSecurityContext
Звонок должен вернуться SEC_I_CONTINUE_NEEDED
и правильно заполнить выходной токен. Содержание этого выходного токена должно идти в BERVAL
структура ldap_sasl_bind_s
ожидает как клиентские учетные данные.
Вызов ldap_sasl_bind_s
с выходом токена от InitializeSecurityContext
как клиентские полномочия. Если все аргументы правильные - пустые DN, GSSAPI в качестве имени механизма - фактический вызов должен вернуться LDAP_SUCCESS
и последняя ошибка LDAP для сеанса LDAP должна быть LDAP_SASL_BIND_IN_PROGRESS
.
В качестве бокового примечания самая последняя ошибка LDAP для сеанса LDAP может быть обнаружена при вызове ldap_get_option
на сеансе, с LDAP_OPT_ERROR_NUMBER
как опция.
Фаза 2
После успешного звонка ldap_sasl_bind_s
, последний аргумент указывает на BERVAL
Структура, содержащая учетные данные сервера. Содержание этого BERVAL
Структура теперь должна использоваться в качестве входного токена для второго вызова InitializeSecurityContext
.
Этот второй звонок InitializeSecurityContext
должен вернуться SEC_OK
и пустой выходной токен.
Этот пустой выходной токен должен использоваться в качестве учетных данных клиента для другого вызова ldap_sasl_bind_s
. Отказ Этот второй звонок ldap_sasl_bind_s
должен вернуться LDAP_SUCCESS
, с самым последним ошибкой LDAP для сеанса LDAP LDAP_SASL_BIND_IN_PROGRESS
.
Фаза 3
После второго успешного звонка ldap_sasl_bind_s
, последний аргумент указывает на BERVAL
Структура, содержащая данные сервера. Данные сервера должны быть даны в качестве ввода в DecryptMessage
. Отказ Как указано в ранее упомянутых RFC, дешифрованные данные должны быть длиной 4 байта.
Клиент должен создать свой ответ в соответствии с информацией в том же RFC.
Примечание: В моем случае я опущел идентификатор авторизации, упомянутый в RFC. К моему пониманию, пустой идентификатор авторизации приводит к тому, что идентификатор аутентификации используется для авторизации.
Ответ, который построен клиент должен быть передан в качестве ввода в EncryptMessage
. Отказ Вывод EncryptMessage
Затем вызов должен быть передан в качестве клиентских учетных данных для третьего и окончательного вызова ldap_sasl_bind_s
.
Примечание: Документация MSDN для использования EncryptMessage
Под Керберосом кажется неполным. Поиск кода Google должен помочь с рабочим примером. Кроме того, для рабочего примера потока, описанного выше, исходный код Samba можно проконсультироваться.
Другие советы
Я нашел проблему.
Согласно этой теме ( https://groups.google.com/group/microsoft.public.actactive.directory.interfaces/browse_Thread/thread/9c13fe85e520f0b4/820a136e032946e9?pli=1.) есть ошибка с LDAP_SASL_BIND_S, возвращая пустые учетные данные сервера в Windows XP. Я проверил свое приложение под сервером Windows 2008, а учетные данные вернуются правильно.
Статья от солнце а также MSDN. Отказ Вероятно, если вы можете попробовать создать образец программы, вы можете получить ответы
Псевдокод
struct berval cred;
char mechanism[BUFSIZ];
getline( mechanism, sizeof(mechanism), stdin, "mechanism? " );
getline( passwd, sizeof(passwd), stdin,"credentials? " );
cred.bv_val = passwd;
cred.bv_len = strlen( passwd );
rc = ldap_sasl_bind_s( ld, dn, mechanism, &cred, NULL, NULL, NULL );