Как я могу реализовать единый вход (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, не зависящего от веб-сервера решения.

Author: Simon East, 2009-06-17

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

 16
Author: realMarkusSchmidt, 2009-10-15 03:32:22

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

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

 1
Author: Benjamin Oakes, 2009-10-15 02:51:51

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

Я рассматривал возможность использования ADLDAP.

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

 1
Author: asgeo1, 2011-12-07 05:31:23

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

У него есть клиентская библиотека php.

Как установить ссылку на MS Active Directory: http://www.ja-sig.org/wiki/display/CASUM/Active +Каталог

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

 0
Author: Hrishi, 2009-10-15 02:14:11

Для 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
Author: Will Shaver, 2009-10-16 19:05:59