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

Posted

技术标签:

【中文标题】在 WCF/WIF 中,如何合并来自两个不同客户端的自定义 sts 令牌的声明【英文标题】:In WCF/WIF how to merge up claims from two different client's custom sts's tokens 【发布时间】:2015-08-23 17:14:41 【问题描述】:

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

所有服务都托管在 IIS 上并使用活动联合方案。 两个 STS 都有带有 ws2007Federation 和 ws2007Http 绑定的端点,RP 使用 ws2007FederationBinding 和 STS2 作为颁发者。

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

所以我决定根据请求将 STS1 中的令牌作为 ActAs RST 的属性传递给 STS2 令牌。那失败了 - 无法解密令牌。

    如何将这两个令牌传递给 STS2 并合并其中的声明? 这是一个坏主意 - 使用 RST 发送刚刚从 STS1 令牌中提取的声明?

【问题讨论】:

您可能需要的是,STS2 信任 STS1 进行身份验证,而您的应用信任 STS2 @TGlatzer 是的,两个 STS 相互信任,但接受具有不同受众 uri 的令牌。 STS1 仅使用有关用户的声明创建令牌,STS2 接受带有机器密钥的令牌,并且必须为用户+机器提供声明。 RP 服务仅信任 STS2 在客户端还是在 STS2 上,您究竟从哪里得到“无法解密令牌”错误消息? 您的场景中的 STS 是什么(例如 ADFS 2.0?) @AdrianHofman“无法解密”在 STS2 上抛出,我已经意识到原因。我通过设置相同属性的作为扩展的令牌传递了令牌,但是 wstrust 不会在请求中写入带有令牌的引用,因此处理程序无法在没有引用键的情况下验证令牌(令牌是带有引用的 genericxml)。对于第二个问题 - 不,我不使用 adfs 或 acs,但我想只使用自定义服务创建类似 kerberos 逻辑的东西。两个 STS 都是自定义的,现在我从我的问题中意识到了场景 2,但仍然不喜欢这个解决方案,因为我认为它不是安全的传递参数/标题中的声明...... 【参考方案1】:

通常您只想在每个步骤中使用一个令牌。因此,如果您需要合并声明,则需要在第二个 STS 的声明转换步骤中执行此操作。

因此,流程将通过 STS1 进行身份验证,然后使用来自 STS1 的令牌通过 STS2 进行身份验证。那时,您将通过声明并转换以根据需要添加其他声明。然后生成的 Token 就可以从 RP 应用程序中使用了。

我实际上已经开始了一个关于我们最近构建的非常相似的场景的博客系列。不要过度自我推销,但它不会让我赚钱,所以我会发布它以防万一。

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

我很乐意深入探讨,但根据您的场景的具体情况,解决方案的具体情况会发生很大变化。我认为以上表达了您想要的一般方法。如果我能提供更多帮助,请告诉我。

【讨论】:

感谢您的回答。实际上我想保留两个令牌 - 来自 IdS (STS1) 的令牌 1 需要从 STS2 获取令牌 2 并一直存在到会话结束。 btw token2 可以在会话生命周期中使用不同的声明多次生成,直到 token1 有效 是的,STS2 转换 token1,但我仍然不知道如何在不违反安全原则的情况下使用 token1 传递额外的 lcaims/属性,因为额外的参数不是使用证书作为生成的令牌体进行加密/签名。

以上是关于在 WCF/WIF 中,如何合并来自两个不同客户端的自定义 sts 令牌的声明的主要内容,如果未能解决你的问题,请参考以下文章

如何合并两个或多个具有不同 where 条件的查询?我必须重用在第一个代码中使用的代码

如何合并来自不同数据库的数据?

在 vue.js 客户端合并来自不同 graphql 解析器的数据以进行简单输出

如何合并来自不同表的记录?

如何合并两个不同的数据帧,时间戳略有不同

如何比较来自两个不同分支的文件