Как передать параметр строки запроса в asp.net?

Я использую службу контроля доступа (ACS). Я выбрал всех поставщиков удостоверений (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");
    }

Когда пользователь нажимает на ссылку signin, указанный выше код вызывает с помощью ajax и получает ips и отображает их в диалоговом окне jquery-ui. И когда пользователь нажимает любой из ips для входа в систему, браузер перенаправляется на выбранную страницу входа ip. После успешного входа в систему элемент управления вернется к моему элементу управления, который я установил как returnUrl. Все это прекрасно работает.

Теперь я пытаюсь передать некоторые значения на страницу входа поставщика идентификаторов (ip) и хочу вернуть эти значения в мой контроллер returnUrl. Для этого я искал и узнал, что есть параметр строки запроса, известный как wctx , который мы можем установить и получить значение при обратном URL-адресе. Но я не знаю, как это сделать. Кто-нибудь может посоветовать мне, как я могу это достичь?

1
nl ja de

1 ответы

Это относительно (довольно) легко.

Ваш URL для показа IdP выглядит примерно так:

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=

Это самый полный запрос для списка поставщиков удостоверений. Возможно, вы пропустите некоторые переменные (например, context или reply_to ), но то, что я показываю, является полным запросом.

Итак, теперь у вас есть два варианта:

  • inclide your own reply_to parameter. It must be withing the configured realm. So if your realm is https://www.mygreatapp.com/, your default return URL would probably be something like https://www.mygreatapp.com/returnUrl/ (if your controller to handle ACS response is returnUrlController. Now, you can safely change the reply_to to be https://www.mygreatapp.com/returnUrl/?foo=bar, just make sure you URL Encode the query string.

  • Use the context parameter. It is safer to use and I would suggest using it. Now your URL for fetching list of IdPs will be something like:

    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=

Обратите внимание, что теперь в запросе для списка IdP присутствует context ([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
                }
            }

Вы можете выполнить любые дополнительные проверки во время обработки SignInResponse из ACS.

2
добавлено
Microsoft Stack Jobs
Microsoft Stack Jobs
1 788 участник(ов)

Work & freelance only Microsoft Stack. Feed https://t.me/Microsoftstackjobsfeed Чат про F#: @Fsharp_chat Чат про C#: @CSharpChat Чат про Xamarin: @xamarin_russia Чат общения:@dotnettalks

Microsoft Developer Community Chat
Microsoft Developer Community Chat
584 участник(ов)

Чат для разработчиков и системных администраторов Microsoft Developer Community. __________ Новостной канал: @msdevru __________ Баним за: оскорбления, мат, рекламу, флуд, флейм, спам, NSFW контент, а также большое количество оффтоп тем. @banofbot