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

时间:2013-01-29 07:01:32

标签: c# azure acs

我正在使用访问控制服务(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");
    }

当用户点击登录链接时,上面的代码使用ajax调用并获取ips并在jquery-ui对话框中显示它们。当用户单击任何一个用于登录的ips时,浏览器将重定向到所选的ip登录页面。成功登录后,控件返回到我设置为returnUrl的控件。至于这一切都很好。

现在我要做的是将一些值传递给身份提供者(ip)登录页面,并希望在我的returnUrl控制器上获取这些值。为此,我搜索并了解到有一个名为wctx的查询字符串参数,我们可以设置它并在返回url处获取值。但我不知道该怎么做。任何人都可以指导我如何实现这一目标?

1 个答案:

答案 0 :(得分:2)

相对(非常)容易。

列出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=

这是对身份提供商列表的最完整请求。您可能会遗漏一些变量(例如contextreply_to),但我展示的是完整的请求。

所以现在你有两个选择:

  • 包含您自己的reply_to参数。它必须与配置的域有关。因此,如果您的领域是https://www.mygreatapp.com/,那么您的默认返回URL可能类似于https://www.mygreatapp.com/returnUrl/(如果您的控制器处理ACS响应是returnUrlController。现在,您可以安全地更改{{1}要成为reply_to,请确保您对查询字符串进行编码。

  • 使用https://www.mygreatapp.com/returnUrl/?foo=bar参数。使用起来更安全,我建议使用它。现在,您获取IdP列表的URL将类似于:

    context

请注意,现在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=[your_custom_string_value_which_you_may_even_encrypt]&request_id=&version=1.0&callback=值([your_custom_string_value_which_you_may_even_encrypt])。在returnUrl处理程序控制器中,您可以使用与以下代码类似(或相等)的代码进行检查:

context

您可能希望在处理来自ACS的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 } } 时执行任何/更多其他检查。