在WCF/WIF中如何合并来自两个不同客户端自定义STS令牌的声明

44

我正在尝试创建这样的东西:客户端使用自定义STS1进行身份验证并获取令牌,接下来客户端使用机器密钥进行授权,并在自定义STS2上发出令牌并获取另一个令牌。 使用最后一个令牌,客户端请求RP服务上的方法。

所有服务都托管在IIS上,并且都使用活动联邦方案。 两个STS具有带有ws2007Federation和ws2007Http绑定的终结点,而RP使用ws2007FederationBinding,其颁发者为STS2。

如果我使用CreateChannelWithIssuedToken创建通道,我只能看到来自STS1的令牌,并且无法获取来自STS2的令牌。

因此,我决定将来自STS1的令牌作为ActAs RST的属性传递给请求STS2令牌的请求。 这失败了-无法解密令牌。

  1. 我如何将两个令牌传递给STS2并合并其中的声明?
  2. 这是一个坏主意吗-只从STS1令牌中提取声明并与RST一起发送?

1
你可能需要的是,让STS2信任STS1进行身份验证,并且你的应用程序信任STS2。 - TGlatzer
1
@TGlatzer 是的,两个 STS 互相信任,但接受具有不同受众 URI 的令牌。STS1 仅创建关于用户的声明令牌,STS2 接受带有机器密钥的令牌并必须为用户+机器提供声明。RP 服务只信任 STS2。 - myrx
你在哪里得到“无法解密令牌”错误消息-在客户端还是STS2上? - Adrian Hofman
你的情况中有哪些STS(例如,ADFS 2.0)? - Adrian Hofman
@AdrianHofman 在STS2上抛出“无法解密”的异常,我意识到了原因。我传递了带有actingas扩展的令牌,并设置了相同的属性,但是wstrust在请求中不会写入带有令牌的引用,因此处理程序无法验证没有引用密钥的令牌(令牌是带有引用的genericxml)。对于第二个问题-不,我不使用adfs或acs,但我想创建类似于kerberos逻辑的自定义服务。两个STS都是自定义的,目前我已经实现了我的问题的第二种方案,但仍然不喜欢这个解决方案,因为我认为在头中传递参数/声明不安全... - myrx
1个回答

1
通常情况下,您只需要在每个步骤中使用一个令牌。因此,如果您需要合并索赔,则应在第二个STS的索赔转换步骤中执行该操作。
因此,流程将是先使用STS1进行身份验证,然后使用来自STS1的令牌对STS2进行身份验证。此时,您将通过索赔并进行转换以添加所需的其他索赔。然后生成的令牌将准备好供RP应用程序使用。
实际上,我已经开始了一系列关于我们最近架构的非常相似的场景的博客。不想过度自我推销,但它不会给我带来任何收入,所以我会发布它以防有帮助。

http://www.livingthearchitecture.com/mixing-sso-with-existing-technologies/

我很乐意深入探讨,但具体情况会导致解决方案的具体变化。我认为上述内容表达了您所需的一般方法。如果需要更多帮助,请告诉我。


感谢您的回答。实际上,我想保留两个令牌——从 IdS(STS1)获取 token2 所需的 token1,并在会话结束前保持有效。顺便说一句,在会话生命周期内可以使用不同的声明多次生成 token2,直到 token1 有效为止。是的,STS2 转换了 token1,但我仍然不知道如何传递附加的声明/属性与 token1,而不违反安全原则,因为附加参数没有像生成的令牌正文一样被加密/签名。 - myrx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接