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

Как создать службу общего доступа в нескольких доменах?

Мне интересно, как реализовать общую систему входа в междоменный домен, а также передовые методы и меры предосторожности. Если вы знакомы с 37Signals, вы, вероятно, привыкли к использованию универсального механизма аутентификации, в котором вам не нужно впоследствии входить в систему, если вы используете навигацию верхнего уровня к другому продукту. Я хотел бы что-то реализовать аналогичным образом.

Ближайшая вещь, которую я нашел в Интернете, - это запись в Википедии Служба централизованной аутентификации и ответ на Вход в кросс-домен - как автоматически войти в систему при переходе из одного домена в другой, который может быть несколько иным в этом случае.

Я проверил свои файлы cookie сеансов, чтобы понять, что они делают в этом процессе. Первоначально каждая ссылка продукта имеет "goto" uristub, т.е.:

https://MY_COMPANY.campfirenow.com/id/users/[int_identifier]/goto

Используя FireCookie и вкладку NET в Firebug, я могу видеть установленные файлы cookie и перенаправления, которые происходят в процессе. URL-адрес goto вызывает перенаправление 302:

https://MY_COMPANY.basecamphq.com/login/authenticate?sig=[BASE64_ENCODED_AND_ENCRYPTED_DATA]

Идентификатор сеанса воссоздается, скорее всего, для целей CSRF. Некоторые из данных в файлах cookie, а также в параметре GET параметров были частично расшифрованы с использованием base64_decode следующим образом:

// sig GET param
array(2) {
  [0]=>
���ף�:@marshal_with_utc_coercionT7�z��<k��kW"
  [1]=>
  string(18) "���k�<kn8�f���to��"
}

// _basecamp_session cookie session param
string(247) {
:_csrf_token"1Sj5D6jCwJKIxkZ6oroy7o/mYUqr4R5Ca34cOPNigqkw=:session_id"%060c0804a5d06dafd1c5b3349815d863"
flashIC:'ActionController::Flash::FlashHash{:
@used{: auth{"
              MY_COMPANY{:
                       user_idi�3
:identity_idi�W����������s�]��:�N[��:

߾ "

Кодирование разбивает блок кода. Спасибо за вашу помощь!

4b9b3361

Ответ 1

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

Я объясню: Вы хотите, чтобы иметь возможность перейти с сайта site.com на сайт2.com, и пусть site2.com знает, что вы являетесь пользователем, зарегистрированным через site1.com.

поскольку файлы cookie не разделяются между разными доменами (другими субдоменами, но, я думаю, вы не говорите о субдоменах), вам нужно передать некоторую информацию о ссылке на site2.com, которая позволит ей говорить с ее внутренними и знаете, кем вы являетесь.

позволяет начать с наивного решения, а затем работать над тем, чтобы решить некоторые из проблем, которые он представляет: предположим, что у вас есть таблица пользователей на какой-то внутренней базе данных, а у вашего пользователя есть ID. теперь предположим, что пользователь аутентифицирован на сайте1.com, и он является пользователем 123 из вашей БД. Наиболее наивным решением было бы назвать site2.com/url/whatever?myRealID=123 и проверьте site2 на этот идентификатор и "верьте" пользователю, что это действительно он.

Проблема. Любой (даже действительный пользователь вашего сайта), который увидит вашу ссылку, может создать ссылку с myRealID = 123 или попробовать другие значения для нее. и site2.com примет его как этого пользователя.

Решение. Не используйте недопустимый идентификатор. Предположим, вы добавили в свою таблицу пользователей уникальный GUID, и если у пользователя 123 есть указатель 8dc70780-15e5-11e0-ac64-0800200c9a66, тогда позвоните по адресу site2.com/url/whatever?myGuid=8dc70780 -15e5-11e0-ac64-0800200c9a66.

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

Решение. Используйте закрытый ключ, сохраненный на вашем сервере, чтобы подписать строку, содержащую следующие элементы данных, текущую метку времени, целевой сайт (то есть "site2.com" ) указанного идентификатора GUID, эту подпись можно перевести в сообщение "Это доказательство того, что эта ссылка была создана сайтом в указанное время для пользователя, который имеет этот идентификатор GUID для аутентификации этим доменом" и отправить его на сайт2.com вместе с меткой времени и идентификатором GUID. Теперь, когда сайт2.com получает ссылку, он может убедиться, что он подписан правильно, и если какой-либо посредник или первоначально пользователь попытается каким-либо образом изменить его (либо меняя время, либо GUID), тогда подпись не будет соответствовать и site2. com откажется от аутентификации пользователя.

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

Решение: добавьте nonce к переданным параметрам. Nonce - это просто случайное число, которое ваша система аутентификации должна удостовериться в том, что она не позволяет вам аутентифицироваться с этим номером более одного раза (следовательно, тогда имя N (umber) -ONCE). Обратите внимание, что это означает, что каждая ссылка, которую вы создаете на site1.com, которая приводит к site2.com, должна иметь отдельное значение, которое должно быть сохранено в фоновом контенте для последующей проверки.

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

Я надеюсь, что это контур, который вы ищете. Возможно, что я что-то пропустил, но это основные рекомендации, используйте подпись, чтобы подтвердить подлинность данных в ссылке и использовать nonce для предотвращения нападений посредника. Я бы также рекомендовал использовать HTTPS для этих ссылок, если это возможно.

Эяль

Ответ 2

Вы можете попытаться реализовать Глобальный сетевой автозапуск решение по переполнению стека.
Там проницательный пост относительно его блестящей реализации Кевином Монтроусом здесь.

Это потребует Cookies, HTML5 localStorage, Javascript, Iframe и множество проверок безопасности, но я думаю, что это того стоит.

Ответ 3

Предоставление пользователям возможности использовать их решение facebook/yahoo/gmail/openID - это начало, но это не позволяет решительно решить решение по внедрению или использованию собственного решения.

Разработав и управляя реализацией в прошлом (мы в конечном счете пошли к SiteMinder, но я предполагаю, что вам не нужна стоимость реального продукта), я думаю, что у Eyal очень хорошая идея, d немного подкорректируйте его.

Во время проверки подлинности генерируйте случайный код (может быть значением GUID, но он не является статичным для пользователя), который хранится в транзакционной таблице вместе с идентификатором пользователя. Этот код имеет максимальный срок службы (вам нужно будет оценить значение безопасности за этот период времени). Этот код в идеале был бы хэширован с именем пользователя или зашифрован и отправлен как часть URL-адреса.

Ответ 4

Вы пробовали что-то вроде Charles, чтобы нюхать то, что отправляется туда и обратно? Возможно, он сможет сломать все для вас.

Как упоминалось FlipScript, возможно, использование OAuth/OpenID может стать для вас способом?

Ответ 5

Взгляните на Jasig CAS http://www.jasig.org/cas. Я думаю, он будет делать то, что вы хотите. Он с открытым исходным кодом и имеет несколько плагинов, позволяющих вам аутентифицировать использование нескольких источников аутентификации и из нескольких доменов/языков.

Ответ 6

Почему бы не использовать Open ID для этой цели.

OperID будет оптимальным решением для этой проблемы.

Ответ 7

Используйте что-то вроде .NET Passport (IE. Windows Live Id) или способ, которым Facebook сделал это с помощью своего API, который может быть открыто просмотрен.