Как я могу изменить ReturnUrl для OpenID? - PullRequest
7 голосов
/ 27 февраля 2009

Когда пользователь нажимает на моем сайте ссылку, требующую аутентификации, браузер перенаправляется на страницу входа. Страница входа включает параметр строки запроса returnUrl. Проблема заключается в том, что если пользователь аутентифицируется с использованием OpenID, провайдеры перенаправляют пользователя обратно на страницу входа в систему и не включают параметр returnUrl, что довольно скучно, потому что я перенаправляю пользователя на домашнюю страницу вместо страницы, на которой пытались .

Я использую DotNetOpenID, есть ли способ это исправить?

Ответы [ 2 ]

11 голосов
/ 04 марта 2009

Это действительно легко, Бруно. Просто позвоните

IAuthenticationRequest.AddCallbackArguments("returnUrl", Request.QueryString["returnUrl"]);

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

3 голосов
/ 27 февраля 2009

Если вы хотите, чтобы поставщик OpenID возвращался на другой URL, вам нужно использовать метод OpenIdRelyingParty.CreateRequest(Identifier userSuppliedIdentifier, Realm realm, Uri returnToUrl) при создании запроса аутентификации.

Однако обычно вы не хотите, чтобы провайдер OpenID перенаправлял обратно на URL, который инициировал последовательность входа в систему в вашем приложении. Вы хотите вернуться к точке, в которой вы инициировали авторизацию OpenID для правильной обработки ответа. Помогает инкапсулировать слой OpenID из остальной логики в вашем приложении.

Вот пример:

В моем приложении ASP.NET MVC у меня есть контроллер User с действием Authenticate, которое обрабатывает запросы на вход в систему.

Действие Authenticate проверяет OpenIdRelyingParty.Response. Если это null, действие вызывает RedirectToProvider. Поставщик возвращается к тому же действию, где я проверяю Respons.Status. Если это AuthenticationStatus.Authenticated, я использую FormsAuthentication.RedirectFromLoginPage(openid.Response.ClaimedIdentifier, true), чтобы вернуться на страницу, с которой пользователь инициировал последовательность входа в систему.

Однако, если статус AuthenticationStatus.Failed или «AuthenticationStatus.Canceled», я могу предложить пользователю шаги для решения этой проблемы. Я могу предложить им исправить свой OpenID, если он введен неправильно, или вместо этого войти в систему с именем пользователя / паролем. (Я поддерживаю как OpenID, так и аутентификацию по имени / паролю для одного и того же идентификатора)

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

...