acs - 从 Azure ACS 下载登录页面后,如何使返回 URL 再次正常工作?

标签 acs

Azure 培训套件包括一个名为“IntroToACS2”的实验室。您可以在其中创建一个 WebRole 并启用 ACS,以便您可以使用您的 Google、Live 或 Yahoo id 登录。本实验的第二部分将引导您完成从 ACS 下载示例登录页面的过程,以便您可以对其进行自定义以匹配您网站的风格。

在执行最后一部分之前,深度链接工作正常。意思是:我可以请求一个安全页面,例如 http://localhost/acsdemo/securepage.aspx ACS 会拦截请求,将我重定向到登录页面,然后返回到 http://localhost/acsdemo/securepage.aspx。 , 但现在它只是让我回到默认页面 http://localhost/acsdemo/default.aspx .

从 Azure ACS 下载登录页面后,需要做什么才能让深层链接再次工作?

最佳答案

当您重定向登录时,securepage.aspx 的返回 URL 通常存储在上下文参数中。在 ACS 托管登录页面和自定义可下载页面中,都有 javascript 查询 ACS 以获取身份提供者列表,然后为每个 IP 生成登录链接。 ACS 托管版本的特殊之处在于它还会收集提供给它的 wctx 并自定义每个 IP 登录 url 以保留此上下文。这样 ACS 就知道在身份验证完成后将用户重定向回何处。

然而,自定义可下载登录页面不保留此上下文,这就是您出现此行为的原因,ACS 只是将您重定向到您在 ACS 配置中指定的返回 URL,在本例中为 default.aspx。

但是您可以更改您的自定义登录页面以插入这个缺少的参数。此处的复杂之处在于,此上下文根据协议(protocol)进行不同的通信。对于 LiveID(WS-Federation),传入的 wctx 可以在 liveID 登录链接的传出 wctx 中重新传输,但以盒装形式“cx”。下面是我添加到实现此目的的 CreateIdentityProviderButton() 函数中的一些 javascript。

    ...

    //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 中作为“上下文”查询参数返回。因此,在您的登录页面中,您可以类似地编辑登录链接中的 openid.return_to,如下所示:

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

您可以根据您在 ACS IdentityProvider.js json 响应中看到的身份提供者名称,将代码编写为登录​​链接的特殊情况。

关于acs - 从 Azure ACS 下载登录页面后,如何使返回 URL 再次正常工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9927518/

相关文章:

asp.net-mvc - 身份验证表单时出现 MVC4 Windows Azure ACS 500 内部服务器错误

c# - 如何在asp.net中传递查询字符串参数?

azure - 丰富 Azure ACS 安全 token

asp.net-mvc-3 - Azure ACS - 最佳实践实现

wcf - ACS 联盟问题

c++ - 想要的CWMP CPE(客户端)和ACS(服务器)

asp.net - 在这种情况下我应该使用 azure connect

azure - 如何向 Azure Active Directory 添加可选声明

oauth-2.0 - 使用不同的 redirect_uri 和 openid.realm 参数从 Google OpenID 2.0 迁移到 OpenID Connect

azure - 身份和访问工具。未在 vs2012 菜单中列出