DotNetOpenID в iFrame

Мне было интересно, можно ли сделать RedirectToProvider и отобразить полученную страницу поставщика OpenID в iFrame. Это сделает процесс аутентификации более упорядоченным.

Я использую библиотеку DotNetOpenID в ASP.NET MVC (VB).

Эта следующая часть является своего рода отдельным вопросом, но имеет отношение.

Я использую Ajax.BeginForm для формы входа OpenID, однако RedirectToProvider здесь не работает по некоторым причинам. DotNetOpenId не работает с MVC и AJAX?

2 ответа

Решение

Да, DotNetOpenId поддерживает iframes, MVC и Ajax. OpenIdAjaxTextBox Элемент управления, который поставляется вместе с библиотекой и показан в одном из примеров, демонстрирует это. Он не использует фреймы для отображения чего-либо. Он использует их с checkid_immediate для попытки неявного входа в систему без какого-либо взаимодействия с пользователем, что является единственным сценарием iframe, который OpenID намеревается поддерживать.

IAuthenticationRequest.RedirectToProvider метод внутренне вызывает ASP.NET Response.Redirect которая сама кидает ThreadAbortException Это может быть причиной того, что это кажется вам неудачным, хотя на самом деле это, вероятно, работает по дизайну, но этот дизайн противоречит тому, что вы, вероятно, пытаетесь сделать.

Существуют различные подходы, чтобы получить то, что вы хотите, но, как уже сказал мастер-класс Алекс, существует проблема безопасности с размещением страницы провайдера в iframe. Дело не в том, что RP может получить доступ к содержимому iframe или согласиться с ним, потому что, как сказал EFraim, если в браузере нет ошибок, которые все равно не будут допущены. Две проблемы с ним - Clickjacking и то, что вы обучаете пользователя фишингу, поскольку он, вероятно, будет предоставлять свои учетные данные для входа в свой OP, в то время как URL RP находится в строке адреса, что является плохой вещью.

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

Кроме того, как вы указали, всплывающие окна, если все сделано правильно, могут помочь сохранить удобство работы с пользователем. Вы можете достичь этого несколькими различными способами, используя DotNetOpenId. Элементы управления ASP.NET, поставляемые с библиотекой, имеют встроенную функцию и могут быть активированы путем установки свойства элемента управления. Но так как вы используете ASP.NET MVC (я думаю), вот как вы можете сделать это самостоятельно:

  1. Когда пользователь нажимает кнопку "Вход" на вашей странице, а не размещает сообщение в текущем окне, используйте Javascript, который открывает всплывающее окно соответствующего размера по URL-адресу, например http://yoursite.com/openid/redirect?id= userSuppliedIdentifier.

  2. Действие Redirect вашего контроллера OpenID будет читать этот идентификатор, сделать OpenIdRelyingParty.CreateRequest на этот идентификатор, и return IAuthenticationRequest.RedirectingResponse.AsActionResult() (Стиль MVC). Обратите внимание, что вы можете передать свой собственный URL CreateRequest для возврата в URL, если вы хотите, чтобы ответ OP возвращался к другому методу на контроллере OpenID.

  3. Когда утверждение возвращается, ваш контроллер должен отправить вниз javascript, который закрывает всплывающее окно и (при необходимости) возвращает сообщение в главное окно, чтобы обновить его состояние для вошедшего в систему пользователя.

Весь этот процесс полностью автоматизирован в элементах управления ASP.NET, которые поставляются с DotNetOpenId. К сожалению, ASP.NET MVC нельзя сделать столь же модульным, как веб-формы ASP.NET, чтобы вам не приходилось выполнять всю эту работу самостоятельно. Конечно, образец MVC, с которым поставляется DotNetOpenId, может быть создан для демонстрации поведения всплывающих окон в будущей версии. Если вы этого хотите, подайте заявку на это.

Вопрос в том, будет ли поставщик OpenID считать это угрозой безопасности или нет? Если страница провайдера находится внутри IFrame, то окружающая страница может иметь некоторый контроль над тем, что происходит внутри этого фрейма, включая попытку сбора некоторой информации. Это может быть возможный риск использования. Помните, что провайдеры OpenID очень параноидальны в отношении этих вещей и могут даже попытаться вырваться из такого IFrame или просто отрицать любые дальнейшие действия при входе в систему. Это риск, что они могут не захотеть принять. Является ли это возможным? Если это так, я думаю, что ответ также зависит от поставщика.

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