Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

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

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

Ответ 3

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

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

Ответ 4

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

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

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

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

Ответ 5

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

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