Как мне вернуть URL-адрес, работающий правильно, после загрузки страницы входа из Azure ACS? - PullRequest
3 голосов
/ 29 марта 2012

В учебный комплект Azure входит лаборатория под названием «IntroToACS2». В нем вы создаете WebRole и включаете ACS, чтобы вы могли войти в систему, используя свой идентификатор Google, Live или Yahoo. Вторая часть лабораторной работы посвящена загрузке примера страницы входа из ACS, чтобы вы могли настроить ее в соответствии со стилем вашего сайта.

Перед выполнением этой последней части глубокое связывание работало нормально. Значение: я мог бы запросить защищенную страницу, такую ​​как http://localhost/acsdemo/securepage.aspx, и ACS перехватил бы запрос, перенаправил меня на страницу входа и затем вернул меня к http://localhost/acsdemo/securepage.aspx,, но теперь он просто возвращает меня на страницу по умолчанию http://localhost/acsdemo/default.aspx.

Что нужно сделать, чтобы после загрузки страницы входа из Azure ACS снова работали глубокие ссылки?

Ответы [ 2 ]

2 голосов
/ 02 апреля 2012

Вот как у меня работают глубокие ссылки:

После загрузки примера страницы входа в Azure я скопировал ее содержимое на страницу aspx с именем Login.aspx, а затем добавил код C # для обновления адреса reply_to.

Найдите тег сценария в Login.aspx и замените '& reply_to =' на '& reply_to = <% = returnUrl%>', как показано ниже:

<script src="https://sample.accesscontrol.windows.net:443/v2/metadata/IdentityProviders.js?protocol=wsfederation&realm=http%3a%2f%2flocalhost%2fSample&reply_to=<%=returnUrl%>&context=&request_id=&version=1.0&callback=ShowSigninPage" type="text/javascript"></script>

Затем добавьте следующий код вLogin.aspx.cs

using System;
using System.Web;

namespace Sample
{
    public partial class Login : System.Web.UI.Page
    {
        protected string returnUrl = "";
        protected void Page_Load(object sender, EventArgs e)
        {            
            var wctx = Request.QueryString["wctx"];
            var wreply = Request.QueryString["wreply"];
            if (wctx == null || wreply == null) return;
            var queryString = HttpUtility.ParseQueryString(wctx);
            var ru = queryString["ru"];
            if (ru == null) return;
            returnUrl = Server.UrlEncode(wreply + ru);
        }
    }
}

Теперь, как создать ссылку / кнопку для входа в систему:

Не создавайте такую ​​ссылку, потому что она выигралане работает:

<a href="Login.aspx">Login</a>

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

<a href="SecurePage.aspx">Login</a>

Я тестировал это только с Google Id., но я ожидаю, что это будет работать для других провайдеров идентификации.

2 голосов
/ 30 марта 2012

URL-адрес возврата для securepage.aspx обычно сохраняется в параметре контекста при перенаправлении для входа в систему. Как на странице входа в ACS, так и на настраиваемой загружаемой странице есть javascript, который запрашивает ACS для списка поставщиков удостоверений, а затем генерирует ссылки для входа для каждого IP-адреса. Хостинг-версия ACS отличается тем, что она также собирает заданный ей wctx и настраивает каждый URL-адрес входа в систему IP для сохранения этого контекста. Таким образом, ACS знает, куда перенаправить пользователя назад, когда аутентификация завершена.

Пользовательская загружаемая страница входа в систему, однако, не сохраняет этот контекст, поэтому вы получаете такое поведение, ACS просто перенаправляет вас на URL-адрес возврата, который вы указали в конфигурации ACS, в данном случае default.aspx.

Но вы можете изменить свою пользовательскую страницу входа, чтобы вставить этот пропущенный параметр. Сложность здесь в том, что этот контекст сообщается по-разному в зависимости от протокола. Для LiveID ( WS-Federation ) входящий wctx может быть повторно передан в исходящем wctx по ссылке для входа в систему liveID, но в коробочной форме "cx". Ниже приведен некоторый JavaScript, который я добавил в функцию CreateIdentityProviderButton (), которая достигает этого.

    ...

    //Creates a stylized link to an identity provider's login page
    function CreateIdentityProviderButton(identityProvider) {

        // Some code I stole from fellow stackoverflow  member for extracting query parameters =)
        var urlParams = {};
        (function () {
                var e,
                    a = /\+/g,  // Regex for replacing addition symbol with a space
                    r = /([^&=]+)=?([^&]*)/g,
                    d = function (s) { return decodeURIComponent(s.replace(a, " ")); },
                    q = window.location.search.substring(1);

                while (e = r.exec(q))
                    urlParams[d(e[1])] = d(e[2]);
            })();

        var cx = "&cx=" + encodeURIComponent(urlParams.wctx);
        var idpList = document.getElementById("IdentityProvidersList");
        var button = document.createElement("button");
        button.setAttribute("name", identityProvider.Name);
        button.setAttribute("id", identityProvider.LoginUrl + encodeURIComponent(cx));

        ...

Для Yahoo или Google ( OpenID ) этот контекст возвращается в openid.return_to в качестве параметра запроса "context". Таким образом, на странице входа в систему вы можете аналогичным образом отредактировать openid.return_to в вашей ссылке для входа в систему следующим образом:

... openid.return_to=https://youracstenant.accesscontrol.windows.net:443/v2/openid?context=<value of the wctx extracted from javascript above> ...

Вы можете написать код для особого случая своей ссылки для входа в систему, основываясь на том, какое имя провайдера идентификации вы видите в ответе json ACS IdentityProvider.js.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...