Как я могу реализовать единый вход (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, которые все еще работают в Windows. Apache2 и php-cgi в Windows, вероятно, являются одной из самых медленных настроек, которые вы могли бы настройка в Windows. Похоже, что Apache все еще может понадобиться (он работает с php-fcgi), но я бы предпочел решение nginx.
Я также до сих пор не понимаю (и хотел бы получить образование), почему необходимы плагины HTTP-сервера, и у нас не может быть PHP, не зависящего от веб-сервера решения.
5 answers
Все, что вам нужно, это 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
и введите имя хоста или полное доменное имя вашего внутреннего приложения (например, myserver или myserver.corp.domain.com). У вас может быть несколько записей, это список, разделенный запятыми.
Мне было бы любопытно узнать о решении, которое использует OpenID в качестве бэкэнда (своего рода) для этого... Я не видел ничего, что могло бы напрямую подключиться к ActiveDirectory, когда я гуглил (быстро). Тем не менее, это может быть довольно безболезненно реализовать через обычный HTTP(Ы) (вы были бы поставщиком OpenID, который проверял учетные данные по вашей локальной рекламе). В лучшем случае вы можете просто добавить пару классов в свое приложение и быть выключенным и запущенным - никаких модулей веб-сервера не требуется. Есть там много открытого исходного кода для обеих сторон этого, так что, если ничего другого, стоит взглянуть. Если бы вы предоставили доступ к бэкэнду пользователям (т. Е. предоставили им 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 +Каталог
Однако вам потребуется 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 находится в моей базе данных разрешенных пользователей.
Убедитесь в этом и проверьте это под непривилегированной учетной записью. Когда я впервые установил это, я протестировал его, и он работал нормально, но позже, когда стандартный пользователь, не являющийся администратором сервера, попробовал его, это не удалось. Оказывается, для некоторых временных каталогов необходимо изменить разрешения для гостя пользователи. Я не могу вспомнить точные настройки.