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

Я смутно осознаю, что на компьютере, подключенном к домену, 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/

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

UPDATE С тех пор как мы опубликовали этот вопрос, мы изменили настройки на nginx и php-fcgi, которые по-прежнему работают в Windows. Apache2 и php-cgi в Windows, вероятно, являются одной из самых медленных настроек, которые вы можете настроить в Windows. Похоже, что Apache все еще может понадобиться (он работает с php-fcgi), но я бы предпочел решение nginx.

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

Ответы [ 5 ]

18 голосов
/ 15 октября 2009

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

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

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 и введите имя хоста или FQDN вашего внутреннее приложение (например, myserver или myserver.corp.domain.com). Вы можете иметь более одной записи, это список через запятую.

1 голос
/ 15 октября 2009

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

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

1 голос
/ 12 октября 2009

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

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

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

0 голосов
/ 16 октября 2009

Для 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 разрешенных пользователей.

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

0 голосов
/ 15 октября 2009

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

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

Как связаться с MS Active Directory: http://www.ja -sig.org / wiki / display / CASUM / Active + Directory

Вам потребуется Apache maven 2.

...