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

StackOverflow https://stackoverflow.com/questions/1003751

Вопрос

Я смутно осознаю, что на компьютере, подключенном к домену, 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-решения, не зависящего от веб-сервера.

Это было полезно?

Решение

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top