c# - 将安全 token 从一个依赖方委托(delegate)给另一个依赖方

标签 c# wcf wif ws-federation ws-trust

我有一个 WCF 服务,它是使用 WIF 构建的自定义 STS 的依赖方。我的 STS 向我的客户端应用程序颁发 key 持有者 token 。我创建了一个新的“后端”WCF 服务,我需要从现有的“前端”服务调用它。 如何在前端服务中使用传入的安全 token 来调用后端服务,而不从 STS 检索新 token ?

enter image description here

到目前为止,在我的前端服务中,使用自定义 Saml11SecurityTokenHandler 访问传入的 SamlSecurityToken 没有问题。

在那之后,我尝试了两种不同的方法来将带外 token 附加到目标后端服务上的服务调用:

  1. 创建自定义 IssuedSecurityTokenProvider
  2. 使用 ChannelFactoryOperations.CreateChannelWithIssuedToken

但是,这两种尝试都会导致错误。据我所知,这似乎是同一个死胡同——他们不接受签名的 SamlSecurityToken。看起来即使这两种方法都接受基本的 SecurityToken 类,但它们都只有在给定 GenericXmlSecurityToken 实例而不是 SamlSecurityToken 的情况下才有效。

更新: 这是一个 code sampleexception details子弹 #1

更新 2: 在做了更多研究之后,我能找到的最接近的东西是一篇关于使用 Identity Delegation 的文章。对于基本上只使用 ActAs token 的 WIF/ADFS,前端服务将使用从客户端应用程序收到的 token 向 STS 发出请求。这将需要对我们的自定义 STS 进行更新,但我们目前不希望这样做。我开始怀疑我在图表中说明的方法是否对 WIF 或 WS-Trust 有效?

最佳答案

事实证明,前端服务重用颁发的 token 来调用后端服务的概念在 WS-Trust 协议(protocol)的范围内是有效的。但是,对于绝大多数情况,不应将其视为一种好的做法。这是出于安全性和可扩展性方面的考虑。在安全方面,这样做会迫使依赖方使用相同的 token 加密算法/ key ,并且还会降低您验证 SAML token 的受众限制的能力。这正是更新 WS-Trust 以支持使用 ONBEHALFOF 和 ACTAS token 的身份委托(delegate)的原因。使用其中任何一个都将有助于以更安全、更可靠的方式处理这种情况。似乎 WIF 的 API 设计遵循了这种思路,这解释了为什么没有找到前端服务的直接 API 来重用传入的已签名 key 持有者 token 来调用后端服务。

总而言之,我对这个问题有两个答案:

一个。如果您是自己定制的 STS 的所有者,则可以通过执行以下步骤在默认 WIF/WCF 管道之外实现此方案:

  1. 在客户端请求程序中,使用 WSTrustChannel 或 IssuedSecurityTokenProvider 从 STS 手动检索 token 。请注意, token 类型将是 GenericXmlSecurityToken 或它的某些派生形式。
  2. 将 token 带外发送到前端服务。在带外,我的意思是将其作为额外的契约(Contract)字段、在消息 header 中或以任何其他方式发送。
  3. 在前端服务中,您可以使用 ChannelFactory.CreateChannelWithIssuedToken() 或创建自定义 IssuedSecurityTokenProvider,轻松使用带外 token 调用后端服务。这在使用传入引导 token 时是不可能的,因为 WIF 将始终创建一个特定类型的引导 token ,例如 SamlSecurityToken。 ChannelFactory 和 IssueSecurityTokenProvider 都只能与 GenericXmlSecurityToken 一起使用!

B.无论您有开箱即用的 STS 还是自定义的,只要它支持 ActAs 或 OnBehalfOf,您就可以使用适当的身份委托(delegate)。

我的结论主要基于以下来源。我希望这最终能帮助有类似要求的其他人。

http://www.cloudidentity.com/blog/2008/09/07/delegation-or-traversing-multilayer-architectures/ (ACTAS/ONBEHALFOF 与 token 重用的惊人解释)

http://msdn.microsoft.com/en-us/library/ee748487.aspx (向下滚动以查找 ACTAS 和 BEHALFOF 的比较)

http://docs.oasis-open.org/ws-sx/ws-trust/v1.4/errata01/os/ws-trust-1.4-errata01-os-complete.html (当然是 wstrust 协议(protocol))

关于c# - 将安全 token 从一个依赖方委托(delegate)给另一个依赖方,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23899697/

相关文章:

c# - 通过 ref 和 out

c# - WCF 序列化和缓存

wcf - 使用 .net 4.5 在 VS2012 中创建自定义 STS 服务

c# - 通过 OleDb c# 在 Excel 中插入回车符

c# - 单击 GridView 中的一行时回发

c# - 如何使用箭头键在文本框之间移动光标?

wcf - WCF 和 DataContractSerializer 序列化 CollectionDataContract 修饰的集合类型是否不同?

c# - 如何在 WCF Rest 服务中传递多个参数?

sharepoint - 将来自自定义声明提供者的电子邮件声明映射到个人资料中的sharepoint用户电子邮件

azure - 如何使用 Windows Azure 访问控制 "pre-authenticate"另一个用户?