Пользовательский поставщик аутентификации для Active Directory через одностороннее доверие

Мы пишем пользовательский поставщик аутентификации для веб-сайта, размещенного на нашем сервере DMZ. Сайт построен на CMS под названием Kentico, которая работает на платформе.NET 4.0. Хостинг-сервер Kentico находится в лесу Active Directory DMZ. Существует другой внутренний лес Active Directory, и DMZ AD имеет одностороннее доверие с внутренней AD (DMZ доверяет внутренней AD, внутренняя AD не доверяет DMZ).

Мы можем без проблем авторизовать пользователей DMZ AD. Но мы также должны иметь возможность аутентифицировать внутренних пользователей AD. Настройки брандмауэра блокируют прямой доступ к внутренним контроллерам домена AD, поэтому нам нужно через доверие и отправлять запросы аутентификации на контроллеры домена DMZ AD.

При попытке аутентификации внутренних пользователей AD - запросы LDAP, отправленные провайдером аутентификации на контроллеры домена DMZ, завершаются с ошибкой "пользователь не найден".

Хотите знать, если кто-нибудь имел дело с этой проблемой раньше и как она была решена. Заранее благодарю за ваши ответы.

1 ответ

Решение

Единственный надежный способ аутентификации пользователей, которые находятся по другую сторону одностороннего доверия, - это функция LogonUserEx в библиотеке advapi32.dll. Я точно знаю, что тип входа LOGON32_LOGON_INTERACTIVE работает, а LOGON32_LOGON_BATCH - нет. LogonUserEx принимает имя домена и имя пользователя в качестве отдельных аргументов или UPN для имени пользователя с нулевым аргументом домена.

Теперь Kentico немного странно, потому что у них есть два провайдера аутентификации из коробки, один для аутентификации на базе данных Kentico и другой для входа в AD с использованием ActiveDirectoryMembershipProvider в пакете System.Web.Security. Похоже, что этот провайдер не может войти ни в кого на другом конце одностороннего доверия. Теперь Kentico не позволяет вам использовать вместо этого собственного провайдера, а требует, чтобы любая пользовательская аутентификация выполнялась через обработчик событий.

Документация Kentico немного слаба в том, как сделать пользовательский обработчик событий. Вот ссылка на то, что у них есть для Kentico 7 (что примерно так же, как для Kentico 6) - http://bit.ly/13DXrFA. Единственная другая практическая информация о создании пользовательского обработчика событий относится к Kentico 6, но она должна нормально работать для Kentico 7, и ее можно найти здесь - http://bit.ly/13DXLEc. Как видно из этой ссылки, целевым событием является SecurityEvents.Authenticate.Execute.

Надеюсь, это поможет.

Другие вопросы по тегам