Я пытаюсь настроить Автозаполнение почты LDAP - встроенный функционал Mozilla Thunderbird 17.0.5 @ Windows 7 x64 в доменной среде 2008R2. ОС - это свежая, готовая к установке на VBox. Похоже на то Я не могу заставить его работать с аутентификацией Kerberos (родной SSPI).
Я правильно настроил параметры LDAP - мне удалось это проверить, используя «простой» режим аутентификации в Thunderbird (в котором приложение просит пользователя вручную ввести учетные данные домена). В этом режиме работает автозаполнение TB.
Однако всякий раз, когда я переключаюсь на аутентификацию Kerberos, я не получаю результатов автозаполнения. VBox показывает некоторую сетевую активность после каждой буквы, которую я ввожу в поле адреса, но результат не возвращается.
Это работает одинаково как для стандартных учетных записей пользователей, так и для учетных записей администратора домена.
Насколько я понимаю, это может быть проблема Thunderbird или проблема домена / Kerberos.
Судя по результатам Google, эта функциональность Thunderbird не очень популярна, но большая часть того, что я прочитал, похоже, доказывает, что она должна работать в любой среде домена, настроенной по умолчанию. Поскольку контроллеры домена были настроены бывшим сотрудником, возможно, что некоторые функции домена были перенастроены или отключены. Я никогда не трогал встроенный Kerberos.
Кто-нибудь может мне посоветовать, что мне искать?
Я попытался отладить клиент Thunderbird и получил журнал, который публикую внизу. Журнал не показывает ошибок, и хотя я почти ничего не знаю о внутренней работе Kerberos, насколько я понимаю, клиент пытается пройти аутентификацию (InitializeSecurityContext: succeeded
), но, кажется, никогда не получает ответа. Однако TB тоже не возвращает ошибок.
Более того, кажется, что журнал почти такой же, независимо от того, правильно ли я настроил Bind DN
название (username@mydomain.com
правильный) или несколько совершенно случайных букв.
Если я запустил Thunderbird после klist purge
, похоже, система правильно получает новые билеты (krbtgt\domain.mydomain.com
и LDAP\dc02.domain.mydomain.com
).
0[e0f140]: nsAuthSSPI::Init
0[e0f140]: InitSSPI
0[e0f140]: Using SPN of [ldap/mydomain.com]
0[e0f140]: AcquireCredentialsHandle() succeeded.
0[e0f140]: entering nsAuthSSPI::GetNextToken()
0[e0f140]: InitializeSecurityContext: continue.
0[e0f140]: pending operation added; total pending operations now = 1
1428[e13ac0]: nsLDAPConnection::RemovePendingOperation(): operation removed
1428[e13ac0]: nsLDAPConnection::RemovePendingOperation(): operation removed; total pending operations now = 0
1428[e13ac0]: entering nsAuthSSPI::GetNextToken()
1428[e13ac0]: InitializeSecurityContext: succeeded.
1428[e13ac0]: pending operation added; total pending operations now = 1
1428[e13ac0]: nsLDAPConnection::RemovePendingOperation(): operation removed
1428[e13ac0]: nsLDAPConnection::RemovePendingOperation(): operation removed; total pending operations now = 0
1428[e13ac0]: pending operation added; total pending operations now = 1
0[e0f140]: nsAuthSSPI::Init
0[e0f140]: Using SPN of [ldap/mydomain.com]
0[e0f140]: AcquireCredentialsHandle() succeeded.
0[e0f140]: entering nsAuthSSPI::GetNextToken()
0[e0f140]: InitializeSecurityContext: continue.
0[e0f140]: pending operation added; total pending operations now = 2
1428[e13ac0]: pending operation removed; total pending operations now = 1
1428[e13ac0]: nsLDAPConnection::RemovePendingOperation(): operation removed
1428[e13ac0]: nsLDAPConnection::RemovePendingOperation(): operation removed; total pending operations now = 0
1428[e13ac0]: entering nsAuthSSPI::GetNextToken()
1428[e13ac0]: InitializeSecurityContext: succeeded.
1428[e13ac0]: pending operation added; total pending operations now = 1
1428[e13ac0]: nsLDAPConnection::RemovePendingOperation(): operation removed
1428[e13ac0]: nsLDAPConnection::RemovePendingOperation(): operation removed; total pending operations now = 0
1428[e13ac0]: pending operation added; total pending operations now = 1
1428[e13ac0]: pending operation removed; total pending operations now = 0
0[e0f140]: nsLDAPOperation::SearchExt(): called with aBaseDn = 'OU=MyContainer,DC=mydomain,DC=com'; aFilter = '(&(objectClass=person)(|(mail=balsams*)(userPrincipalName=balsams*)(sn=balsams*)(cn=balsams*)))'; aAttributes = a,sn,mail; aSizeLimit = 100
0[e0f140]: pending operation added; total pending operations now = 1
1428[e13ac0]: pending operation removed; total pending operations now = 0
0[e0f140]: nsLDAPOperation::SearchExt(): called with aBaseDn = 'OU=MyContainer,DC=mydomain,DC=com'; aFilter = '(&(objectClass=person)(|(mail=balsam*)(userPrincipalName=balsam*)(sn=balsam*)(cn=balsam*)))'; aAttributes = a,sn,mail; aSizeLimit = 100
0[e0f140]: pending operation added; total pending operations now = 1
1428[e13ac0]: pending operation removed; total pending operations now = 0
0[e0f140]: nsLDAPOperation::SearchExt(): called with aBaseDn = 'OU=MyContainer,DC=mydomain,DC=com'; aFilter = '(&(objectClass=person)(|(mail=balsa*)(userPrincipalName=balsa*)(sn=balsa*)(cn=balsa*)))'; aAttributes = a,sn,mail; aSizeLimit = 100
0[e0f140]: pending operation added; total pending operations now = 1
1428[e13ac0]: pending operation removed; total pending operations now = 0
0[e0f140]: nsLDAPOperation::SearchExt(): called with aBaseDn = 'OU=MyContainer,DC=mydomain,DC=com'; aFilter = '(&(objectClass=person)(|(mail=bals*)(userPrincipalName=bals*)(sn=bals*)(cn=bals*)))'; aAttributes = a,sn,mail; aSizeLimit = 100
0[e0f140]: pending operation added; total pending operations now = 1
1428[e13ac0]: pending operation removed; total pending operations now = 0
0[e0f140]: nsLDAPOperation::SearchExt(): called with aBaseDn = 'OU=MyContainer,DC=mydomain,DC=com'; aFilter = '(&(objectClass=person)(|(mail=bal*)(userPrincipalName=bal*)(sn=bal*)(cn=bal*)))'; aAttributes = a,sn,mail; aSizeLimit = 100
0[e0f140]: pending operation added; total pending operations now = 1
1428[e13ac0]: pending operation removed; total pending operations now = 0
0[e0f140]: nsLDAPOperation::SearchExt(): called with aBaseDn = 'OU=MyContainer,DC=mydomain,DC=com'; aFilter = '(&(objectClass=person)(|(mail=bals*)(userPrincipalName=bals*)(sn=bals*)(cn=bals*)))'; aAttributes = a,sn,mail; aSizeLimit = 100
0[e0f140]: pending operation added; total pending operations now = 1
1428[e13ac0]: pending operation removed; total pending operations now = 0
0[e0f140]: nsLDAPOperation::SearchExt(): called with aBaseDn = 'OU=MyContainer,DC=mydomain,DC=com'; aFilter = '(&(objectClass=person)(|(mail=balsa*)(userPrincipalName=balsa*)(sn=balsa*)(cn=balsa*)))'; aAttributes = a,sn,mail; aSizeLimit = 100
0[e0f140]: pending operation added; total pending operations now = 1
1428[e13ac0]: pending operation removed; total pending operations now = 0
0[e0f140]: nsLDAPOperation::SearchExt(): called with aBaseDn = 'OU=MyContainer,DC=mydomain,DC=com'; aFilter = '(&(objectClass=person)(|(mail=balsam*)(userPrincipalName=balsam*)(sn=balsam*)(cn=balsam*)))'; aAttributes = a,sn,mail; aSizeLimit = 100
0[e0f140]: pending operation added; total pending operations now = 1
1428[e13ac0]: pending operation removed; total pending operations now = 0
0[e0f140]: unbinding
0[e0f140]: unbound
0[e0f140]: unbinding
0[e0f140]: unbound
Оно работает! В конце концов, ответ был довольно простым, хотя я нашел его вслепую:
Bind DN
поле должно быть пустым!Как только вы установите для свойства Bind DN значение пустое, оно заработает!
Обратите внимание, что есть еще некоторые дополнительные препятствия:
mydomain.com
) как адрес сервера LDAP. Вам нужно специально использовать одно имя DC (т. Е. dc03.mydomain.com
). Поскольку файл конфигурации TB представляет собой код javscript, я попытаюсь добавить несколько контроллеров домена в некоторый массив и рандомизировать ldap_2.servers.MyCompany.uri
на каждом старте.ldap_2.servers.MyCompany.autoComplete.filterTemplate
это запрос на совпадение с автозаполнением, например. (|(mail=%v*)(userPrincipalName=%v*)(sn=%v*)(cn=%v*))
, то %v
обозначает все буквы, которые вы уже набрали в адресном поле,ldap_2.servers.MyCompany.autoComplete.nameFormat
"красивое имя" для адреса электронной почты (например, имя и фамилия), вы должны указать имена полей LDAP в квадратных скобках, например: [givenName] [sn]
ldap_2.servers.MyCompany.autoComplete.commentFormat
- дополнительный столбец в раскрывающемся списке автозаполнения, может использоваться для некоторой дополнительной информации, такой как организационная единица - если вы храните ее в своем AD LDAP.