3

Azure Training Kit には、「IntroToACS2」というタイトルのラボが含まれています。その中で WebRole を作成し、ACS を有効にして、Google、Live、または Yahoo ID を使用してログインできるようにします。ラボの 2 番目の部分では、サンプルのログイン ページを ACS からダウンロードして、サイトのスタイルに合わせてカスタマイズできるようにするプロセスについて説明します。

この最後の部分を行う前は、ディープリンクは正常に機能していました。意味: http://localhost/acsdemo/securepage.aspxなどの安全なページを要求すると、ACS が要求をインターセプトし、ログイン ページにリダイレクトしてから、http://localhost/acsdemo/securepage.aspxに戻します。 、しかし今はデフォルトページhttp://localhost/acsdemo/default.aspxに戻るだけです。

Azure ACS からログイン ページをダウンロードした後、ディープ リンクが再び機能するようにするには、何をする必要がありますか?

4

2 に答える 2

2

通常、securepage.aspx のリターン URL は、ログインのためにリダイレクトするときにコンテキスト パラメータに格納されます。ACS がホストするログイン ページとカスタムのダウンロード可能なログイン ページの両方に、ACS に ID プロバイダー リストを照会し、各 IP のログイン リンクを生成する JavaScript があります。ACS ホスト バージョンは、指定された wctx も収集し、各 IP ログイン URL をカスタマイズしてこのコンテキストを保持するという点で特別です。このようにして、ACS は、認証が完了したときにユーザをリダイレクトする場所を認識します。

ただし、カスタムのダウンロード可能なログイン ページでは、このコンテキストが保持されません。そのため、この動作が発生します。ACS は、ACS 構成で指定したリターン URL (この場合は default.aspx) にリダイレクトするだけです。

ただし、カスタム ログイン ページを変更して、この不足しているパラメーターを挿入することができます。ここで複雑なのは、このコンテキストがプロトコルに応じて異なる方法で伝達されることです。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 応答に表示される ID プロバイダー名に基づいて、ログイン リンクを特別なケースにするコードを作成できます。

于 2012-03-30T01:30:09.593 に答える
2

ディープリンクを機能させる方法は次のとおりです。

Azure からサンプル ログイン ページをダウンロードした後、そのコンテンツを Login.aspx という 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 でしかテストしていませんが、他の ID プロバイダーでも機能すると思います。

于 2012-04-02T15:28:47.653 に答える