2013-02-20 34 views
0

我想从RP1和RP2应用中针对ACS和我的自定义STS提供商认证用户。我需要知道用户来自哪个应用程序RP1或RP2。这是可能的和如何做到这一点?检测原始中继应用

我认为这是微不足道的,而不使用ACS,但如何与ACS做到这一点。

回答

1

在联邦链中,STS理论上只知道其邻居(在这种情况下,您的IdP只知道ACS),因此您不能这样做。能够做到这一点的唯一正式支持方式是在ACS中注册与两个不同逻辑身份提供商相同的物理STS(例如http://myidp.com/rp1http://myidp.com/rp2)。

然而,在实践中,你可以用另一种方式做到这一点,尽管这种方式在官方上是不受支持的。以下假设您使用WS-Federation作为自定义IdP,但您也可以为其他协议做类似的工作。 ACS对来自原始请求的所有数据进行编码,包括领域和回复地址,使用WS联合响应的wctx参数中的Base64UrlEncoding进行编码。您可以通过以下方式进行解码的情况下:

SignInRequestMessage message = WSFederationMessage.CreateFromUri(Request.Url); 

byte[] bytes = HttpServerUtility.UrlTokenDecode(message.Context); 

string decodedContext = UTF8Encoding.UTF8.GetString(bytes); 

这会给你一组名称/值对,其中两个将是rm=<realm>&ry=<reply>,这将是境界和回复原来的RP的地址。

正如我上面提到的,尽管如此,请注意,这不是官方支持的,并且此上下文字符串的格式将来可能会发生变化。

+1

另一种可能更安全的方法是使用身份提供程序元数据下载IdP的登录URL,以托管定制的HRD页面(http://msdn.microsoft.com/zh-cn/library/gg185963.aspx)。在该页面上,您可以将额外的查询参数添加到标识RP的身份提供商的登录URL中。 – 2013-02-23 02:40:12

+0

我发布了更详细的答复在这里类似的问题:http://stackoverflow.com/questions/15097275/passing-url-parameters-from-azure-acs-to-my-custom-identity-provider/15100131#15100131 – 2013-02-27 19:52:23