Да, DotNetOpenId поддерживает iframes, MVC и Ajax. Элемент управления OpenIdAjaxTextBox
, который поставляется с библиотекой и показан в одном из примеров, демонстрирует это. Он не использует фреймы для отображения . Он использует их с checkid_immediate для попытки неявного входа в систему без какого-либо взаимодействия с пользователем, что является единственным сценарием iframe, который OpenID намеревается поддерживать.
Метод IAuthenticationRequest.RedirectToProvider
внутренне вызывает ASP.NET Response.Redirect
, который сам выдает ThreadAbortException
, что может быть причиной того, почему он кажется вам неудачным, хотя на самом деле он, вероятно, работает по проекту, но этот дизайн конфликтует с тем, что вы, вероятно, пытаетесь сделать.
Существуют различные подходы, чтобы добиться того, что вы хотите сделать, но, как уже сказал мастер-класс Алекс, существует проблема безопасности с размещением страницы провайдера в iframe. Дело не в том, что RP может получить доступ к содержимому iframe или согласиться с ним, потому что, как сказал EFraim, если в браузере нет ошибок, которые все равно не будут допущены. Две проблемы с ним: Clickjacking и то, что вы обучаете пользователя фишингу, поскольку он, вероятно, будет предоставлять свои учетные данные для входа в свою операционную систему, в то время как URL-адрес RP находится в строке адреса, которая является плохо.
И на самом деле, крупные ОП теперь сознательно отказываются работать, когда они активированы в рамках iframe, поэтому после того, как все будет работать так, как вы хотите, вы, вероятно, будете разочарованы тем, что большинство ваших клиентов выиграли ». не сможет войти.
Также, как вы указали, всплывающие окна, если все сделано правильно, могут помочь сохранить удобство работы с пользователем. Вы можете достичь этого несколькими различными способами, используя DotNetOpenId. Элементы управления ASP.NET, поставляемые с библиотекой, имеют встроенную функцию и могут быть активированы путем установки свойства элемента управления. Но так как вы используете ASP.NET MVC (я думаю), вот как вы можете сделать это самостоятельно:
Когда пользователь нажимает кнопку «Вход» на вашей странице, а не размещает сообщение в текущем окне, используйте Javascript, который открывает всплывающее окно соответствующего размера по URL-адресу, например http://yoursite.com/openid/redirect?id=userSuppliedIdentifier.
Действие Redirect вашего контроллера OpenID будет считывать этот идентификатор, делать OpenIdRelyingParty.CreateRequest
для этого идентификатора и return IAuthenticationRequest.RedirectingResponse.AsActionResult()
(стиль MVC). Обратите внимание, что вы можете передать свой собственный URL-адрес CreateRequest
для URL-адреса returnTo, если вы хотите, чтобы ответ OP возвращался к другому методу на контроллере OpenID.
Когда подтверждение возвращается, ваш контроллер должен отправить вниз javascript, который закрывает всплывающее окно и (при необходимости) сообщает обратно в главное окно, чтобы обновить его состояние для вошедшего в систему пользователя.
Весь этот процесс полностью автоматизирован в элементах управления ASP.NET, с которыми поставляется DotNetOpenId. К сожалению, ASP.NET MVC нельзя сделать столь же модульным, как веб-формы ASP.NET, чтобы вам не приходилось выполнять всю эту работу самостоятельно. Конечно, образец MVC, с которым поставляется DotNetOpenId, может быть создан для демонстрации поведения всплывающих окон в будущей версии. Если вы хотите, подайте запрос на это .