Как аутентифицировать пользователей в разных доменах с помощью ASP.NET и iframe?

Я делаю веб-сайт ASP.NET для клиента, который хочет сделать свою страницу отчетов доступной через IFRAME на других веб-сайтах «реселлеров». Сайты реселлеров предоставляют одну и ту же услугу под другим брендом. Мне нужно избегать, где я могу, требовать от них реализации какого-либо кода на своем веб-сервере, чтобы включить это - следовательно, использовать iframes.

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

Мы можем использовать SSL-сертификаты сервера, но не любой федеративный логин (например, OpenId) — бизнес-выбор клиента.

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

Любые мысли будут высоко оценены!


person Leon van der Walt    schedule 01.06.2009    source источник


Ответы (3)


Ваша форма входа может использовать некоторый javascript для отправки формы входа в скрытый iframe (вы не можете использовать XMLHTTPRequest из-за проблем междоменной безопасности) для каждого домена, для которого вам требуется вход в систему.

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

Последний трюк для поддержки IE — перевернуть злой бит и добавить

P3P: CP="CAO PSA OUR"

к вашим заголовкам ответа HTTP. Что говорит браузеру: «Я не собираюсь делать ничего плохого, честное слово».

http://support.microsoft.com/kb/323752

http://www.w3.org/P3P/

person lambacck    schedule 01.06.2009
comment
Интересно, спасибо, еще не уверен, что это ответит, но посмотрю. - person Leon van der Walt; 01.06.2009
comment
Извиняюсь, не ясно: сайт реселлера регистрирует пользователя на своем сервере и хочет избежать повторного входа в систему. Таким образом, если реселлер сообщает первичному сайту, что Боб хочет просмотреть отчет, первичный сайт может найти пользователя Боба и, если он может убедиться, что запрос действительно поступил от авторизованного реселлера, предоставить отчет. Полезный ответ, но я даю вам балл :) - person Leon van der Walt; 01.06.2009

Я не вижу удовлетворительного способа сделать это без реализации какого-либо кода на сайте торгового посредника.

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

После проверки на основном сайте этот ключ будет использоваться для аутентификации торгового посредника и, соответственно, вошедшего в систему пользователя.

Ответ на этот запрос будет содержать строку фрагмента html, которую торговый посредник может вставить на любую страницу.

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

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

В случае, если секретный ключ или пароль пользователя были скомпрометированы, HTTPS из браузера все равно не имело бы значения.

person Leon van der Walt    schedule 03.06.2009

Возможно, я что-то упускаю, но если клиент аутентифицирован на вашем сервере, он все равно будет аутентифицирован, если вы просматриваете его через iframe.

Например, создайте HTML-страницу на своем сервере с iframe для gmail. Пока вы аутентифицированы в Gmail в своем браузере, вы увидите свой почтовый ящик на этой странице...

person Assaf Lavie    schedule 01.06.2009
comment
Спасибо за ответ. В ответ; он еще не аутентифицирован во втором домене. Пользователь входит в домен A, загружает оттуда страницу, содержащую iframe, который загружает контент из домена B. Как аутентифицировать пользователя в домене B без реализации (не-HTML) кода на сервере в A? - person Leon van der Walt; 01.06.2009
comment
Используйте тот же механизм, который пользователь использует при входе на ваш сайт. например если пользователь не вошел в систему, он увидит страницу входа... (опять же, как с gmail) - person Assaf Lavie; 01.06.2009