我想针对 ACS 和我的自定义 STS 提供程序对来自 RP1 和 RP2 应用程序的用户进行身份验证。我需要知道用户来自哪个应用程序 RP1 或 RP2。有可能吗?怎么做?
我认为不使用 ACS 是微不足道的,但如何使用 ACS 来做到这一点。
我想针对 ACS 和我的自定义 STS 提供程序对来自 RP1 和 RP2 应用程序的用户进行身份验证。我需要知道用户来自哪个应用程序 RP1 或 RP2。有可能吗?怎么做?
我认为不使用 ACS 是微不足道的,但如何使用 ACS 来做到这一点。
在联邦链中,STS 理论上只知道它的邻居(在这种情况下,您的 IdP 只知道 ACS),因此您不能这样做。能够做到这一点的唯一官方支持的方法是将相同的物理 STS 注册为 ACS 中的两个不同的逻辑身份提供者(例如http://myidp.com/rp1和http://myidp.com/rp2)。
但是,在实践中,您可以通过其他方式执行此操作,尽管官方不支持这种方式。以下假设您将 WS-Federation 用于您的自定义 IdP,尽管您也可以对其他协议执行类似的操作。ACS 对来自原始请求的所有数据进行编码,包括领域和回复地址,这些数据在 WS-Federation 响应的参数中使用Base64UrlEncoding进行编码。wctx
您可以通过以下方式解码上下文:
SignInRequestMessage message = WSFederationMessage.CreateFromUri(Request.Url);
byte[] bytes = HttpServerUtility.UrlTokenDecode(message.Context);
string decodedContext = UTF8Encoding.UTF8.GetString(bytes);
这将为您提供一组名称/值对,其中两个将是rm=<realm>&ry=<reply>
,它们将是您原始 RP 的领域和回复地址。
但是,正如我上面提到的,请注意,这不受官方支持,并且此上下文字符串的格式将来可能会发生变化。