Перейти к содержимому

NTLM-авторизация не работает - разбор причин

Прозрачный вход по доменной учётной записи перестал работать или не заработал вовсе. Разбираем причины в порядке убывания частоты.

С чего начать

Смотрим, включён ли модуль и что он ждёт от веб-сервера:

use Bitrix\Main\Loader;
Loader::includeModule('ldap');
echo COption::GetOptionString('ldap', 'use_ntlm', 'N'), "\n"; // включён ли вход
echo COption::GetOptionString('ldap', 'ntlm_varname', 'REMOTE_USER'), "\n";
// имя переменной, в которой веб-сервер передаёт распознанного пользователя

Прозрачный вход работает связкой: веб-сервер распознаёт пользователя и кладёт его имя в переменную, а сайт эту переменную читает. Пустая переменная означает, что до сайта дело не дошло и разбирать надо конфигурацию сервера.

Проверяем, что приходит от веб-сервера:

// временно на любой странице сайта
printf("REMOTE_USER=%s AUTH_USER=%s\n",
$_SERVER['REMOTE_USER'] ?? '(пусто)', $_SERVER['AUTH_USER'] ?? '(пусто)');

Заполненное имя вида DOMAIN\user означает, что распознавание работает и остаётся сопоставить пользователя с записью на сайте. Пустое - что веб-сервер доменную проверку не выполняет.

Ищем пользователя с таким внешним идентификатором:

$login = preg_replace('/^.*\\\\/', '', $_SERVER['REMOTE_USER'] ?? '');
$res = CUser::GetList('ID', 'ASC', ['LOGIN_EQUAL' => $login],
['FIELDS' => ['ID', 'LOGIN', 'EXTERNAL_AUTH_ID', 'ACTIVE']]);
while ($row = $res->Fetch()) {
printf("%-6s %-20s внешний=%s активен=%s\n",
$row['ID'], $row['LOGIN'], $row['EXTERNAL_AUTH_ID'] ?: '-', $row['ACTIVE']);
}

Пустой результат при заполненной переменной означает, что первая половина связки работает, а вторая - нет: сотрудника на сайте просто нет. Лечится это импортом из каталога либо созданием записи при первом входе.

Смотрим настройки веб-сервера:

Окно терминала
# проверка домена настраивается в конфигурации сайта, а не в настройках модуля
grep -rn 'ntlm\|auth_gss\|AuthType' /etc/nginx/bx/site_avaliable/*.conf 2>/dev/null | head
grep -rn 'AuthType' /etc/httpd/bx/conf/*.conf 2>/dev/null | head

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

Причины

  1. Веб-сервер не выполняет доменную проверку примерно 35% случаев

    ПризнакПеременная с именем пользователя пуста на всех страницах.

    ПроверкаПечатаем переменные окружения на пробной странице и смотрим настройки модуля проверки в веб-сервере.

    Что делатьВключаем доменную проверку в конфигурации веб-сервера: без неё сайту нечего читать.

  2. Сайт открывают не по тому имени примерно 25% случаев

    ПризнакПо короткому имени вход проходит, по внешнему адресу - нет.

    ПроверкаСверяем адрес в строке браузера со списком доверенных узлов домена.

    Что делатьДобавляем имя сайта в доверенную зону браузера: прозрачный вход работает только для доверенных узлов.

  3. Пользователь не сопоставлен с записью на сайте примерно 20% случаев

    ПризнакИмя от веб-сервера приходит, но сайт всё равно показывает форму входа.

    ПроверкаИщем пользователя с таким внешним идентификатором в списке учётных записей.

    Что делатьЗапускаем импорт из каталога организации либо включаем создание записи при первом входе.

  4. Второй сайт не настроен на прозрачный вход примерно 12% случаев

    ПризнакНа основном сайте вход работает, на дополнительном - нет.

    ПроверкаСмотрим настройки модуля и конфигурацию веб-сервера отдельно для каждого сайта пула.

    Что делатьПовторяем настройку для второго сайта: она задаётся на каждый сайт, а не на сервер целиком.

  5. Настройки потерялись после обновления окружения примерно 8% случаев

    ПризнакВход работал и перестал сразу после обновления сервера.

    ПроверкаСмотрим конфигурацию веб-сервера: сгенерированные файлы переписываются при обновлении.

    Что делатьВозвращаем настройку и кладём её в подключаемый файл, который окружение не перезаписывает.

Частые вопросы

Нужен ли импорт пользователей для прозрачного входа?

Не обязательно: запись может создаваться при первом успешном входе. Импорт нужен, когда сотрудники должны существовать на сайте заранее.

Почему вход работает не во всех браузерах?

Прозрачная передача учётных данных выполняется только для доверенных узлов, и список таких узлов у каждого браузера свой. Внешний адрес сайта в него обычно не входит.

Можно ли оставить и обычную форму входа?

Да, она остаётся запасным способом для тех, кто вне домена. Прозрачный вход при этом срабатывает раньше и формы не показывает.

Как проверить настройку без домена под рукой?

Подстановкой имени пользователя в переменную окружения на пробной странице. Так проверяется вторая половина связки - сопоставление с учётной записью сайта.

Смежное

Первоисточник