这相对(相当)容易。
您列出 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_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=
请注意,现在context
IdP 列表请求中存在值 ([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的信息时,您可能希望执行任何/更多附加检查。