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 на исходную страницу? Таким образом, поискового бота "просят" дважды изменить свой индекс для этой страницы?

Другие вопросы по тегам