1

Access Control サービス (ACS) を使用しています。次のコードを使用して、アプリケーションに設定したすべての ID プロバイダー (ip) をフェッチしました。

    public ActionResult IdentityProviders(string serviceNamespace, string appId)
    {
        string idpsJsonEndpoint = string.Format(Global.IdentityProviderJsonEndpoint, serviceNamespace, appId);
        var client = new WebClient();
        var data = client.DownloadData(idpsJsonEndpoint);

        return Content(Encoding.UTF8.GetString(data), "application/json");
    }

ユーザーがサインイン リンクをクリックすると、上記のコードが ajax を使用して呼び出され、ips を取得して jquery-ui ダイアログに表示します。また、ユーザーがログイン用の IP のいずれかをクリックすると、ブラウザは選択した IP ログイン ページにリダイレクトされます。ログインに成功すると、コントロールは returnUrl として設定したコントロールに戻ります。これまで、すべてが正常に機能しています。

今私がやろうとしているのは、いくつかの値を ID プロバイダー (ip) ログイン ページに渡し、returnUrl コントローラーでそれらの値を取得することです。wctxこのために私は検索し、リターンURLで値を設定して取得できるクエリ文字列パラメーターがあることを知りました。しかし、これを行う方法がわかりません。どうすればこれを達成できますか?

4

1 に答える 1

2

比較的(かなり)簡単です。

IdP を一覧表示するための URL は次のようになります。

https://[your_namespace].accesscontrol.windows.net:443/v2/metadata/IdentityProviders.js?protocol=wsfederation&realm=[your_realm]&reply_to=[configured_return_url_for_your_rp]&context=&request_id=&version=1.0&callback=

これは、ID プロバイダーのリストに対する最も完全な要求です。context一部の変数 ( 、 、 など)が欠落している可能性がありますreply_toが、表示されるのは完全な要求です。

したがって、次の 2 つのオプションがあります。

  • 独自のreply_toパラメータを含めます。構成されたレルム内にある必要があります。したがって、レルムがhttps://www.mygreatapp.com/の場合、デフォルトの戻り URL はおそらく次のようになりますhttps://www.mygreatapp.com/returnUrl/(ACS 応答を処理するコントローラーが の場合returnUrlController。これで、 を安全に に変更できreply_toますhttps://www.mygreatapp.com/returnUrl/?foo=bar。クエリ文字列を URL エンコードするようにしてください。

  • パラメータを使用しcontextます。使用する方が安全です。使用することをお勧めします。IdP のリストを取得するための URL は次のようになります。

    https://[your_namespace].accesscontrol.windows.net:443/v2/metadata/IdentityProviders.js?protocol=wsfederation&realm=[your_realm]&reply_to=[configured_return_url_for_your_rp]&context=[your_custom_string_value_which_you_may_even_encrypt]&request_id=&version=1.0&callback=

contextIdP リスト ([your_custom_string_value_which_you_may_even_encrypt]) の要求に値が存在することに注意してください。returnUrl ハンドラー コントローラーで、次のような (または同等の) コードを使用して確認できます。

if (ControllerContext.HttpContext.Request.Form["wresult"] != null)
            {
                // This is a response from the ACS - you can further inspect the message if you will
                SignInResponseMessage message =
                    WSFederationMessage.CreateFromNameValueCollection(
                    WSFederationMessage.GetBaseUrl(ControllerContext.HttpContext.Request.Url),
                    ControllerContext.HttpContext.Request.Form)
                    as SignInResponseMessage;

                if (!string.IsNullOrWhiteSpace(message.Context))
                {
                    // do whatever you want with the context value
                }
            }

SignInResponsefrom ACSの処理中に、追加のチェックを実行する必要がある場合があります。

于 2013-01-29T07:24:39.670 に答える