Междоменный вход - как автоматически входить в систему при переходе с одного домена на другой

Мы предлагаем ряд онлайн-сервисов. От нас требуется разработать систему, которая обеспечивает быстрый / простой опыт для пользователей, если они переводятся с одной службы (на domain1.com) на другую (на domain2.com).

Есть ли безопасный и надежный способ автоматического входа пользователя в систему после того, как он был переведен в новую службу?

Кричите на меня, если приведенное ниже решение полностью небезопасно / неверно.

Мы рассматривали систему, аналогичную той, что предоставляется рядом онлайн-сервисов для восстановления пароля - им по электронной почте отправляется ссылка с уникальным хешем, срок действия которого истекает, что позволяет им изменить свой пароль.

Сайт domain1.com сгенерирует уникальный хэш и сохранит его в базе данных с хешем, связанным с пользователем, вместе с полем даты и времени истечения срока действия.

Пользователь будет переведен на domain2.com/auto/?hash=d41d8cd98f00b204e9800998ecf8427e

Затем domain2.com отправит запрос к domain1.com с хешем, чтобы получить информацию о пользователе. domain1.com затем удалит хеш из базы данных. domain2.com будет регистрировать пользователя и устанавливать файлы cookie и т. д.

Может ли что-то, основанное на OpenID или OAuth, достичь тех же результатов?

SQL Injection: Атаки в реальной жизни и как это вредит бизнесу
SQL Injection: Атаки в реальной жизни и как это вредит бизнесу
Один-единственный вредоносный запрос может нанести ущерб вашему бизнесу. Уязвимости вашего кода могут привести к:
55
0
40 689
5

Ответы 5

Если бы кто-то смог сыграть человека посередине и захватить этот хеш, смог бы он украсть передачу между доменами? Очевидно, что его нужно сгенерировать и отправить клиенту до того, как им понадобится его использовать. Так скажем, например:

Я играю человека посередине, шпионящего за Джеком. Джек обращается к domain1.com, что вызывает подготовку и отправку хэша ему, чтобы при доступе к domain2.com он мог отправить этот хеш в качестве аутентификации. Когда он обращается к domain1.com, его запрос проходит через меня, вы возвращаете страницу, я беру хеш и позволяю ему продолжить. Я обращаюсь к domain2.com, используя хэш, теперь вы впустили меня в domain2.com и удалили хеш. Он не станет мудрее, пока не попытается войти в domain2.com и ему не сообщат, что его учетные данные больше не действительны.

Как это преодолеть?

С SSL. Вы не можете играть в человека посередине, если Джек аутентифицирует сервер domain1.com и имеет конфиденциальный канал.

erickson 05.12.2008 02:41

хорошая точка зрения. Теоретически это должно означать, что модель OP должна быть достаточно безопасной, если предположить, что они тогда используют SSL.

BenAlabaster 05.12.2008 04:34

Это хорошее решение. Вот два момента, которые следует учитывать:

Вы используете термин «хэш», но неясно, какие данные вы будете хешировать. Вместо этого используйте «одноразовый номер»: большое (128-битное) число, генерируемое ГСЧ криптографического качества.

Кроме того, вы не указали это, но связь между пользователем и обоими доменами, а также между самими доменами должна быть безопасной. Используйте SSL для аутентификации серверов и сохранения конфиденциальности одноразового номера.

Единая точка входа (SSO) концептуально довольно прост.

  • Пользователь попадает в domain1.com.
  • domain1.com видит, что cookie сеанса нет.
  • domain1.com перенаправляет на sso.com
  • sso.com представляет страницу входа и принимает учетные данные
  • sso.com устанавливает cookie сеанса для пользователя
  • sso.com затем перенаправляет обратно на domain1 по специальному URL-адресу (например, domain1.com/ssologin)
  • URL-адрес ssologin содержит параметр, который в основном «подписан» sso.com. Это может быть так же просто, как base64 шифрования логина с использованием общего секретного ключа.
  • domain1.com берет зашифрованный токен, расшифровывает его, использует новый идентификатор входа в систему для входа пользователя.
  • domain1 устанавливает cookie сеанса для пользователя.

Теперь следующий случай.

  • Пользователь попадает в domain2.com, который следует за domain1 и перенаправляет на sso.com.
  • sso.com уже имеет файл cookie для пользователя, поэтому не отображает страницу входа
  • sso.com перенаправляет обратно на domain2.com с зашифрованной информацией
  • domain2.com авторизуется пользователем.

Это основы того, как это работает. Вы можете сделать его более надежным, более функциональным (например, это SSOn, но не SSOff, пользователь может «выйти из системы» из domain1, но по-прежнему войти в систему в domain2). Вы можете использовать открытые ключи для подписи учетных данных, у вас могут быть запросы на передачу дополнительной информации (например, прав авторизации и т. д.) С сервера SSO. У вас может быть более тесная интеграция, например, когда домены будут регулярно проверять, что у пользователя все еще есть права с сервера SSO.

Но рукопожатие печенья через браузер с использованием перенаправлений является ключевой основой, на которой основаны все эти решения SSO.

Мне нравится этот метод ... конечно, он полагается на еще один домен для выполнения своей работы. Что добавляет сложности. Однако я сам не могу придумать лучшего решения +1

BenAlabaster 05.12.2008 04:36

Что ж, SSO того же домена проще, потому что вам не нужно выполнять махинации с файлами cookie перенаправления. Но это сработает в любом случае.

Will Hartung 05.12.2008 06:45

будьте осторожны с URL-адресом ssologin с параметром "signed" ... если ваш параметр не содержит одноразового номера / отметки времени, кто-то, перехватывающий эту строку запроса, сможет использовать ее для входа. установка всего через SSL смягчит это.

russau 15.12.2010 08:51

@russau Я собираюсь реализовать этот метод, но мне сложно установить одноразовый номер, где мне его хранить?

albanx 02.12.2014 15:35

@albanx Одноразовые номера - это часть запроса. Вы используете одноразовый номер для проверки действительности запроса. Например, для nonce устанавливается текущее время по Гринвичу, и когда сервер его получает, он может сравнить время nonce с текущим временем. Если ему больше, скажем, 1 минуты, он может отклонить запрос. Но просто добавьте одноразовый номер к запросу в виде обычного текста.

Will Hartung 02.12.2014 20:29

@WillHartung Я нашел действительную реализацию с nonce здесь stackoverflow.com/questions/4145531/…

albanx 03.12.2014 10:39

1. Следует ли использовать токен JWT в запросе domain2.com к sso.com? 2. И если sso.com еще не имеет файла cookie для пользователя и, таким образом, представляет страницу входа, получим ли мы 3 перенаправления (один на sso.com, один на вход в систему sso.com, один на целевую страницу domain2.com)? 3. Можем ли мы использовать другой токен JWT, на этот раз выпущенный sso.com, для отправки на domain2.com для предоставления входа в систему?

Stephane 19.03.2017 10:52

А как насчет SEO? Похоже, что каждый запрос до успешного входа в систему перенаправляется на другой домен и обратно. Я бы сказал, что это очень некрасиво. Какие заголовки нужно отправлять? 301 в систему единого входа, а затем вернуться 301 на исходную страницу? Значит, поискового бота «просят» дважды изменить индекс для этой страницы?

Перенаправление на SSO должно быть его концом - если вы не войдете в систему, вас не перенаправят обратно.

Skip Head 17.09.2010 22:21

Нет смысла использовать SSL для междоменного входа, если вы не используете SSL для всего сеанса. Украсть cookie сеанса так же легко, как и использовать хэш в URL-адресе. Какой смысл скрывать хеш в SSL, если остальная часть сеанса небезопасна.

Метод, указанный вверху, в значительной степени является стандартным. Другой вопрос, будете ли вы использовать безопасные протоколы, но было бы бессмысленно шифровать только часть сеанса.

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