Cross Domain Login - Как автоматически войти в систему при переходе с одного домена на другой
Мы предлагаем ряд онлайн-услуг. Мы должны разработать систему, которая обеспечивает быстрый / простой опыт для пользователей, если они переводятся из одного сервиса (на domain1.com
) в другой сервис (на domain2.com
).
Существует ли безопасный и надежный способ автоматического входа пользователя в систему после его перехода на новую услугу?
Кричите на меня, если приведенное ниже решение совершенно небезопасно / неправильно.
Мы рассматривали систему, аналогичную той, которая предоставляется рядом онлайн-сервисов для восстановления пароля - им по электронной почте отправляется ссылка с уникальным хешем, срок действия которого истекает, что позволяет им сменить пароль.
domain1.com
сгенерирует уникальный хеш и сохранит его в базе данных с хешем, связанным с пользователем, вместе с полем даты истечения срока действия.
Пользователь будет переведен на domain2.com/auto/?hash=d41d8cd98f00b204e9800998ecf8427e
domain2.com
будет затем сделать запрос domain1.com
с хешем для получения информации о пользователе. domain1.com
затем удалит хеш из базы данных. domain2.com
будет входить в систему пользователя и установить cookie и т. д.
Может ли что-то на основе OpenID или OAuth достичь таких же результатов?
5 ответов
Единый вход (SSO) концептуально довольно прост.
- Хиты пользователя
domain1.com
, domain1.com
видит, что нет файла cookie сессииdomain1.com
перенаправляет наsso.com
sso.com
представляет страницу входа и принимает учетные данныеsso.com
устанавливает сессионный cookie для пользователяsso.com
затем перенаправляет обратно наdomain1
на специальный URL (например,domain1.com/ssologin
)ssologin
URL содержит параметр, который в основном "подписан"sso.com
, Это может быть так же просто, как base64 для шифрования loginid с использованием общего секретного ключа.domain1.com
берет зашифрованный токен, расшифровывает его, использует новый идентификатор входа в систему для входа в систему пользователя.domain1
устанавливает сессионный cookie для пользователя.
Теперь следующий случай.
- Хиты пользователя
domain2.com
что следуетdomain1
и перенаправляет наsso.com
sso.com
уже имеет cookie для пользователя, поэтому не отображает страницу входаsso.com
перенаправляет обратно наdomain2.com
с зашифрованной информациейdomain2.com
входит в систему пользователя.
Это основы того, как это работает. Вы можете сделать его более надежным, более функциональным (например, это SSOn, но не SSOff, пользователь может "выйти" из domain1
, но все равно войдите в domain2
). Вы можете использовать открытые ключи для подписи учетных данных, у вас могут быть запросы на передачу дополнительной информации (например, права авторизации и т. Д.) С сервера единого входа. Вы можете иметь более тесную интеграцию, например, домены, регулярно проверяющие, что у пользователя все еще есть права от сервера единого входа.
Но рукопожатие cookie через браузер с использованием перенаправлений является ключевым фундаментом, на котором основаны все эти решения единого входа.
Если кто-то сможет сыграть человека в середине и получить этот хэш, сможет ли он украсть междоменную передачу? Очевидно, что он должен быть сгенерирован и отправлен клиенту до того, как ему понадобится его использовать. Так скажем, например:
Я играю человека в середине, шпионящего за Джеком. Джек доступ domain1.com
который заставляет хеш быть подготовленным и посланным ему так, чтобы, когда он получает доступ domain2.com
он может отправить этот хэш в качестве аутентификации. Как он получает доступ domain1.com
, его просьба приходит через меня, вы возвращаете страницу, я беру хэш и позволяю ему продолжать. Я получаю доступ domain2.com
используя хэш, вы теперь позволили мне domain2.com
и удалил хеш. Он не мудрее, пока не попытается войти в domain2.com
и ему сказали, что его учетные данные больше не действительны.
Как вы преодолеваете это?
Не было бы никакого смысла в использовании SSL для междоменного входа в систему, если вы не используете SSL для всего сеанса. Украсть сессионный cookie так же просто, как использовать хеш в URL. Какой смысл скрывать хеш в SSL, если остальная часть сеанса небезопасна.
Метод, приведенный вверху, в значительной степени является стандартным методом. Если вы решите использовать безопасные протоколы, это совсем другое дело, но было бы бессмысленно шифровать только часть сеанса.
Это хорошее решение. Вот два момента для рассмотрения:
Вы используете термин "хэш", но не ясно, какие данные вы будете хэшировать. Вместо этого используйте "nonce": большое (128-битное) число, сгенерированное RNG криптографического качества.
Кроме того, вы не указали это, но связь между пользователем и обоими доменами, а также между самими доменами должна быть безопасной. Используйте SSL для аутентификации серверов и обеспечения конфиденциальности одноразового номера.
Как насчет SEO? Похоже, что каждый запрос до успешного входа перенаправляется на другой домен и обратно. Я бы сказал, что это очень некрасиво. Какие заголовки вы должны отправить? 301 до SSO, а затем обратно 301 на исходную страницу? Таким образом, поискового бота "просят" дважды изменить свой индекс для этой страницы?