通常、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 プロバイダー名に基づいて、ログイン リンクを特別なケースにするコードを作成できます。