Единый вход в несколько доменов
У нашей компании есть несколько доменов с одним веб-сайтом, размещенным на каждом из доменов. В настоящее время каждый домен имеет свою собственную аутентификацию, которая осуществляется с помощью файлов cookie.
Когда кто-то вошел в один домен, чтобы получить доступ к чему-либо из другого, пользователь должен снова войти в систему, используя другие учетные данные на другом веб-сайте, расположенном в другом домене.
Я думал о переходе на единый вход (SSO), чтобы устранить эту проблему. Буду признателен за любые идеи о том, как этого можно достичь, поскольку у меня нет никакого опыта в этом отношении.
Благодарю.
Изменить: веб-сайты представляют собой смесь интернет-сайтов (внешних) и интранет-сайтов (используемых внутри компании).
4 ответа
Решение SSO, которое я здесь реализовал, работает следующим образом:
- Существует главный домен, login.mydomain.com со скриптом master_login.php, который управляет входами в систему.
- Каждый клиентский домен имеет свой скрипт client_login.php
- Все домены имеют общую базу данных пользовательских сеансов.
- Когда клиентский домен требует, чтобы пользователь вошел в систему, он перенаправляет на основной домен (login.mydomain.com/master_login.php). Если пользователь не выполнил вход в мастер, он запрашивает у пользователя аутентификацию (т.е. отображает страницу входа в систему). После аутентификации пользователь создает сеанс в базе данных. Если пользователь уже аутентифицирован, он ищет его идентификатор сеанса в базе данных.
- Главный домен возвращается в клиентский домен (client.mydomain.com/client_login.php), передавая идентификатор сеанса.
- Клиентский домен создает cookie, хранящий идентификатор сеанса от мастера. Клиент может узнать зарегистрированного пользователя, запросив общую базу данных, используя идентификатор сеанса.
Заметки:
- Идентификатор сеанса - это уникальный глобальный идентификатор, сгенерированный по алгоритму из RFC 4122.
- Master_login.php будет перенаправлять только на домены в своем белом списке
- Мастер и клиенты могут находиться в разных доменах верхнего уровня. Например. client1.abc.com, client2.xyz.com, login.mydomain.com
Не изобретай велосипед. Существует целый ряд междоменных SSO-пакетов с открытым исходным кодом, таких как JOSSO, OpenSSO, CAS, Shibboleth и другие. Если вы используете технологию Microsoft повсеместно (IIS, AD), вы можете вместо этого использовать федерацию Microsoft (ADFS).
Насколько отличаются имена хостов?
Эти хосты могут делиться файлами cookie:
- mail.xyz.com
- www.xyz.com
- logon.xyz.com
Но они не могут:
- abc.com
- xyz.com
- www.tre.com
В первом случае вы можете использовать решение на основе файлов cookie. Вспомните GUID и таблицу сеансов базы данных.
Если вы используете Active Directory, каждое приложение может использовать AD для аутентификации, тогда вход в систему может быть беспроблемным.
В противном случае, если приложения могут общаться друг с другом за кулисами, вы можете использовать сессионные идентификаторы и иметь одно приложение, обрабатывающее генерацию идентификатора, обслуживающее все ваши другие приложения.