1

我正在使用访问控制服务 (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 的值。但我不知道该怎么做。谁能指导我如何实现这一目标?

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=

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

所以现在你有两个选择:

  • 包括你自己的reply_to参数。它必须与配置的领域一致。因此,如果您的领域是https://www.mygreatapp.com/,您的默认返回 URL 可能类似于https://www.mygreatapp.com/returnUrl/(如果您处理 ACS 响应的控制器是returnUrlController。现在,您可以安全地将其更改reply_tohttps://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
                }
            }

SignInResponse在处理来自 ACS的信息时,您可能希望执行任何/更多附加检查。

于 2013-01-29T07:24:39.670 回答