服务提供者之间的 SAML 2.0 身份验证断言(C#、.net、MVC4、组件空间)
Posted
技术标签:
【中文标题】服务提供者之间的 SAML 2.0 身份验证断言(C#、.net、MVC4、组件空间)【英文标题】:SAML 2.0 authentication assertion between service providers (C#, .net, MVC4, Component Space) 【发布时间】:2012-08-21 15:22:59 【问题描述】:我正在构建的系统有问题。我已经成功实施了一个由 SP 发起的 SSO 系统。但是,当考虑到该系统具有多个必须能够交互和交换数据的独特且完全隔离的服务提供者时,就会出现问题。当一个 SP (SP1) 需要与另一个 SP (SP2) 通信时,它们需要能够在保持安全的同时无缝转换。因此,我假设他们需要能够断言或共享 SAML 数据。
例如,用户尝试通过 SP1 访问系统并被重定向到 IdP。用户针对 IdP 进行身份验证,然后 IdP 将通过 http post 断言回 SP1。用户现在在 SP1 上执行一系列任务,最终需要数据传输或浏览器重定向到 SP2。 SP2 不知道 SP1 已成功验证用户身份并收到来自 IdP 的 SAML 响应。这就是我的问题出现的地方。我需要实现一种机制,使 SP2 能够了解用户在 SP1 上的状态。更一般地说,我需要允许一组服务提供者中的任何服务提供者就用户的状态相互断言。但是,我找不到有关完成此任务的“官方”方式的文档。
我已经想到了解决这个问题的多种解决方案,但我怀疑它们中的任何一个至少是“官方的”。 一种是在 IdP 上保留 SAML 断言列表,可以由 guid 引用。然后将一个链接从 SP1 传递到 SP2,该链接将引用一个控制器操作和允许 IdP 将数据重新断言到 SP2 的 guid。这似乎缓慢而复杂。 两个将在 SP1 上收到响应后以某种方式保留 SAML 响应,并在用户被重定向时以某种方式将数据传递给 SP2。
我可能想多了,把这个过程复杂化了。我可能需要转向 IdP 发起的基于 SSO 的解决方案。我可能正在查看文档中的某些内容。
如果有人能对这个话题有所了解,将不胜感激。我很乐意提供有关该主题的任何其他信息。
【问题讨论】:
【参考方案1】:如果您控制 IdP(从某种意义上说,您可以在 IdP 端实现一些额外的东西)我会考虑在颁发 SAML 令牌时在 IdP 端保留一些信息,然后将信息附加到 SAML 令牌。
假设 SP1 通过重定向到 IdP 登录。您存储此信息(cookie、会话)。然后 SP2 通过重定向到 IdP 登录。如果这是同一个浏览器会话,那么信息仍然存在,在 IdP 端,只是因为您之前已经预先设置了它(cookie、会话)。然后,您可以使用此信息向 SP2 发出任何断言。
我不太明白为什么您必须存储此信息以供 guid 引用。
虽然上述想法仅适用于您的服务联系 IdP 的顺序(SP1 没有信息;SP2 有关于 SP1 的信息;SP3 有关于 SP1 和 SP2 的信息,但是 SP1 仍然没有关于 SP2 和 SP3 的信息,因为它赢得了'不要启动与 IdP 的另一个对话,因为它已经过身份验证),我认为您可以通过让您的服务删除身份验证信息来轻松消除此限制,以便与您的服务的下一次联系需要它启动与 IdP 的对话。
例如,SP1 没有信息,SP2 有关于 SP1 的信息,但是 SP1 想要获取关于 SP2 的信息。为此,SP1 在本地“注销”,以便它转到 IdP 并获取有关 SP2(以及任何其他已登录方)的信息。
【讨论】:
我可能已经找到了一种在 IdP 上使用会话来完成此任务的方法。我将发布更新或最终解决方案。【参考方案2】:我们解决问题的方法是针对 IdP 对用户进行身份验证。然后,一旦用户通过身份验证,我们将允许会话在一段时间内保持活动状态。该解决方案通过对 IdP 进行身份验证完全独立于 SP,从而使 SSO 成为可能。换句话说,不是 SP 跟踪哪些其他 SP 已通过身份验证,因为那是 IdP 的工作。如果用户从浏览器登录到 IdP 并将该浏览器重定向到任何一个分布式 SP,则每当该 SP 向 IdP 发送其身份验证请求时,它都会根据自己的会话进行验证并向 SP 断言。
【讨论】:
以上是关于服务提供者之间的 SAML 2.0 身份验证断言(C#、.net、MVC4、组件空间)的主要内容,如果未能解决你的问题,请参考以下文章
使用 SAML 2.0 作为 SSO 的外部身份提供者的身份服务器 4
为已通过身份验证的用户向 SP 发起 SAML 2.0 发布