Аутентификация пользователей с помощью Active Directory в приложении Client-Server

Мне было предложено предоставить поддержку для аутентификации пользователей в Active Directory в нашем существующем клиентском сервере.

В настоящее время пользователь поставляет имя пользователя и пароль с клиентской машины, передается по проводу (зашифрован) на наш серверный процесс и сопоставляется с именем пользователя/паролем, хранящимся в базе данных.

Вначале я думал, что это будет непростая задача, поскольку я могу просто аутентифицировать имя пользователя/пароль для пользователей Active Directory с нашего сервера. Однако выясняется, что пользователям не нужно вводить пароль из нашего клиентского приложения, вместо этого беря его учетные данные из текущего сеанса входа в Windows.

Теперь я столкнулся с проблемой аутентификации с использованием Active Directory без пароля? Я уверен, что должен быть способ как-то передать какой-то "токен" из клиент к нашему серверному процессу, который можно использовать в качестве альтернативного метода проверки подлинности, но мои исследования до сих пор нарисовали пробел.

Наш сервер написан на С++, поэтому мы будем использовать win32 API. Я также намерен разработать и отладить это с помощью виртуальной машины под управлением Windows 2008 AD LDS - я надеюсь, этого будет достаточно для того, что я пытаясь достичь.

Любая помощь или совет очень ценятся.

Ответ 1

Вы выполняете NTLM/Kerberos/Negotiate цикл обмена SSPI. Существует полная выборка в MSDN для клиента и server. Чтобы быть ясным: вы не используете какой-либо доступ к LDAP. Является ли LSA (Local Security Authority), который ведет переговоры с LDAP и устанавливает личность клиента. Если вы успешно выполняете весь цикл SSPI, аутентификация уже выполнена, а идентификатор клиента аутентифицирован по LDAP. Если ваш сервер должен знать идентификатор клиента (например, знать имя пользователя rname), он извлекает его из контекста безопасности, приводимого в цикле SSPI, используя QueryContextAttributes(..., SECPKG_ATTR_NAMES,...) и извлекает имя пользователя из структуры SecPkgContext_Names.