Как я могу реализовать единый вход (SSO) с использованием Microsoft AD для внутреннего PHP-приложения?

Я смутно знаю, что на компьютере, подключенном к домену, IE может быть предложено отправить некоторые дополнительные заголовки, которые я мог бы использовать для автоматической подписки на приложение. У меня apache работает на сервере Windows с mod_php. Я бы хотел, чтобы пользователь не мог войти в систему, если это необходимо. Я нашел несколько ссылок о модулях Kerberos и Apache.

http://www.onlamp.com/pub/a/onlamp/2003/09/11/kerberos.html?page=last https://metacpan.org/pod/Apache2::AuthenNTLM

Поскольку я работаю в Windows, доказано, что нет необходимости в создании модулей Perl или Apache. Но разве PHP не имеет доступа к HTTP-заголовкам?

Я нашел это, но он не делает никакой аутентификации, он просто показывает, что PHP может читать заголовки NTLM. http://siphon9.net/loune/2007/10/simple-lightweight-ntlm-in-php/

Я хочу, чтобы мои пользователи просто указывали на приложение и автоматически проверяли их. Кто-нибудь имел какой-либо опыт в этом или получил его на работу вообще?

ОБНОВЛЕНИЕ Начиная с первоначальной публикации этого вопроса, мы изменили настройки на nginx и php-fcgi, все еще работающие на окнах. Apache2 и php-cgi на окнах, вероятно, являются одной из самых медленных настроек, которые вы можете настроить на окнах. Это похоже на то, что Apache все еще может понадобиться (он работает с php-fcgi), но я бы предпочел решение nginx.

Я также до сих пор не понимаю (и хотел бы получить образование), почему необходимы серверы HTTP-сервера, и у нас не может быть агностическое решение PHP, веб-сервера.

Все, что вам нужно – это модуль Apache mod_auth_sspi .

Пример конфигурации:

 AuthType SSPI SSPIAuth On SSPIAuthoritative On SSPIDomain mydomain # Set this if you want to allow access with clients that do not support NTLM, or via proxy from outside. Don't forget to require SSL in this case! SSPIOfferBasic On # Set this if you have only one domain and don't want the MYDOMAIN\ prefix on each user name SSPIOmitDomain On # AD user names are case-insensitive, so use this for normalization if your application's user names are case-sensitive SSPIUsernameCase Lower AuthName "Some text to prompt for domain credentials" Require valid-user 

И не забывайте, что вы также можете использовать Firefox для прозрачного единого входа в домене Windows : просто перейдите в about:config , network.automatic-ntlm-auth.trusted-uris поиск network.automatic-ntlm-auth.trusted-uris и введите имя хоста или полное доменное имя вашего внутреннего приложения (например, myserver или myserver.corp.domain.com). У вас может быть несколько записей, это список, разделенный запятыми.

Мне было бы интересно, какое решение использует OpenID в качестве бэкэнда (для этого) … Я не видел ничего, что могло бы подключиться к ActiveDirectory напрямую, когда я googled (быстро). Тем не менее, было бы довольно безболезненно реализовать через простой HTTP (S) (вы были бы провайдером OpenID, который проверял учетные данные против вашего локального AD). В лучшем случае вы можете просто добавить пару классов в приложение и быть выключенным и запущенным – не требуется модулей веб-сервера. Существует много открытых исходных кодов для обеих сторон, поэтому, если ничего другого, стоит взглянуть. Если вы открыли бэкэнд для пользователей (т. Е. Дали им URL-адреса OpenID), у вас будет дополнительное преимущество, заключающееся в возможности входа в систему не только на внутренние сайты с использованием этих учетных данных. (Пример: переполнение стека.)

В стороне, я был бы против этого, чтобы Internet Explorer был необходим. Я не уверен, что это та цель, которую вы написали, но в зависимости от вашей ИТ-среды я ожидал бы, что люди, которые используют Firefox или Safari (или Opera или …), будут меньше энтузиазма. (Вы не разрабатываете против IE в первую очередь, не так ли? Это было больно, когда я это делал.) Это не значит, что вы не могли использовать эту функцию IE, просто чтобы она не была единственным вариантом , В опубликованной вами ссылке указано, что NTLM работает с более чем IE, но поскольку у меня нет опыта с ним, трудно судить, насколько хорошо это сработает.

У меня была аналогичная проблема, которую мне нужно было решить для моей организации.

Я изучал использование adLDAP .

На сайте также имеется документация для обеспечения полной аутентификации с Active Directory.

Один из вариантов для вас – использовать CAS (центральная служба аутентификации).

Он имеет клиентскую библиотеку php.

Как подключиться к MS Active Directory: http://www.ja-sig.org/wiki/display/CASUM/Active+Directory

Однако вам понадобится Apache maven 2.

Для IIS / PHP FCGI вам необходимо отправить неавторизованный заголовок:

 function EnableAuthentication() { $realm = "yoursite"; header('WWW-Authenticate: Digest realm="'.$realm.'",qop="auth",nonce="'.uniqid().'",opaque="'.md5($realm).'"'); header("HTTP/1.1 401 Unauthorized"); exit; } 

Затем вы можете получить имя пользователя:

 $winuser = $_SERVER["REMOTE_USER"]; 

Затем я удостоверяюсь, что $ winuser находится в моей базе данных разрешенных пользователей.

Будьте ДОСТАТОЧНЫ и проверяйте это под учетной записью без привилегий. Когда я впервые установил это, я протестировал его, и он работал нормально, но позже, когда обычный пользователь, не являющийся сервером, попробовал его, это не удалось. Оказывается, некоторые временные каталоги должны иметь разрешения для гостевых пользователей. Я не могу вспомнить точные настройки.