如何使用 SAML 和 Shibboleth 实施或集成单点登录
Posted
技术标签:
【中文标题】如何使用 SAML 和 Shibboleth 实施或集成单点登录【英文标题】:How to implement or integrate single sign on with SAML and Shibboleth 【发布时间】:2012-07-10 12:00:31 【问题描述】:我们有两个独立的产品,都包括网络应用和服务器。
我们想为它们都实现单点登录,这样当用户登录到一个产品时,他可以自动访问属于他的另一个产品中的资源。
我进行了一些探索,发现 SAML 是一种我们可以采用的好方法,但我们不确定要如何进行。
实现我们自己的服务提供者是个好主意吗?我看过 Shib SP,但看起来如果我想将它集成到我的产品中,也不会那么容易。
所以我只是在寻找以前遇到过类似问题的人的一些建议。
另一个问题是,如果我需要使用 OpenSaml 实现 SP,我可以研究哪些资源?看起来我可以参考的教程或示例并不多。
如果有人能指出我自己的 SP 需要包含的一些大程序或组件,我也将不胜感激。
编辑 1:
试着提供更多关于我想要什么的细节。我们有两种不同的产品。目前我们能够外部化用户数据库。例如,我们的产品可以配置为连接到 LDAP 服务器或任何其他外部用户数据库,只要它们正确实现服务即可。
现在我们的目标是我们的两种产品都需要 SSO。一种情况是我们在两种产品中都有自己的 SP 组件(实现或集成)。客户可能有自己的 IdP。通过一些配置,我们的 SP 可以连接到他们的 IdP,并从那里进行身份验证,用户无需登录两次即可访问这两个产品。当然,如果客户没有,我们可以提供开箱即用的 IdP。
【问题讨论】:
How to build and run Shibboleth SAML IdP and SP using Docker container 在 GitHub 存储库中提供了有关使用 Shibboleth SAML IdP 和 OpenLDAP 在 Java 中为 SAML 构建您自己的 IDP 的说明。 【参考方案1】:Shibboleth 的最大困难在于它实际上是 SAML v2.0 规范的参考实现。
不过,对于大多数例行安装,您实际上只需要很少的 SAML 规范就可以为 SSO 启用几个 Web 应用程序。
但是,由于 Shibboleth 实现了整个事情,以及它的所有功能,它可能很难配置。
我们使用 Shibboleth 做了一个项目(诚然,它是一个边缘用例),而对于我来说,当时是 SAML 新手,让所有东西都启动并正常工作真的是一件苦差事。
对于我们的下一个测试,我通过 Web Profile 查看了 SSO 的 SAML spec。如果您阅读它,对于这个有限的用例来说,它实际上非常简单。我们决定不再使用 Shibboleth,而是使用 OpenSAML 库编写自己的 IdP 和 SP。
我们可以让 Shibboleth 更快地工作吗?大概。但我认为我们不会像我们自己那样理解它。当然,这里有点“未发明”,但是当您确实了解软件和词汇时,这些东西就足够令人困惑了,当您不了解时就更不用说了。 SAML 充满了新词汇。
您还可以考虑使用 SimpleSAML 作为 IdP 并为您的网络应用编写自己的 SP。 SimpleSAML 在 php 中,但它对用户更友好一些。您可以将其视为自包含的 apache 服务。
我会说我们的 SP 大约有 1000 行 javadoc'd 代码,但它主要将 OpenSAML 内容和一些实用程序连接在一起。事实上,它并没有那么可怕。不过,请准备好真正享受阅读已签名的 XML blob。
令人沮丧的是,这确实并不简单,但在收养等方面有点鸡/蛋的事情。
如果这些都不适合您,您可以查看 OAuth2 及其一些配置文件。
【讨论】:
当我尝试使用 Shib SP 和 IdP 设置演示时,我的感受与您完全一样。它过于强大和灵活。我花了很多时间阅读他们的维基和谷歌其他相关资源。我们需要了解许多新词汇。非常感谢您的帖子。尝试实现我们自己的 SP 让我更加勇敢。您能否与我分享一些您在编写自己的 SP 代码时引用的资源或示例?我在网上看的不多。 我搜索了一下,发现了code.google.com/p/websso。我自己没有使用这个,但作为第一次切割,它看起来相当不错。它具有等式的 SP 和 IdP 方面。 svn 结帐...很大。我也找到了capcourse.com/Library/OpenSAML/index.html,但是他的代码没有(明显的)许可证,所以我没有仔细看。但它有通用的 SAML 示例,如果您遇到困难,您可以查看这些示例。 非常感谢。我会看看这些例子。【参考方案2】:如果您只想在 2 个产品之间实现 SSO,我认为是的,从头开始构建更容易。如果是 Java,Shibboleth 的 OpenSaml 是一个非常好的库。
当您开始实施更多的东西和一些复杂的场景时,选择已经构建的东西是最好的选择。您还应该注意您可能会基于每个系统编写的一些内容(例如断言生成、xml-dsig、验证等)。
乍一看,似乎已经构建的产品过于复杂或难以扩展或适应您的特定需求。但是,当您想要扩展所有 SAML 功能时,您编写连接器和实现的开发努力会得到回报。
不过,如果您能更详细地解释您想要实现的目标,那将非常有帮助;我觉得你的问题很开放......
【讨论】:
谢谢。我已经更新了我原来的帖子。我同意这个问题有点开放。我已尽力提供尽可能多的细节。 @performanceuser 给出了您的更新,如果没有超出此范围,我建议编写一个简单的 SAML 断言消费端点来执行所有逻辑,并要求您的客户按顺序在那里发布在您这边启用登录。您仍然需要处理一些事情(即注销、安全性),但我认为编写它并了解约束的时间少于您了解完整 Shibo 产品所需的时间。 谢谢。我将尝试实施一个。您能否与我分享一些有关使用 openSAML 实现 SP 的资源或示例?我在网上看的不多。 我也没有。我有这个非常简单的方法,它没有什么复杂的,也没有很多东西,但它可以帮助你了解如何构建和处理响应:github.com/xnt/jsamlutil 我发现 Shibboleth SP 的设置相当容易。使用 OpenSAML 库来编写我自己的库似乎是一个更大的痛苦。因为我是 SAML 的新手,所以我不必猜测如何实现一切,这很好——Shibboleth 主要引导我走上正确的道路。如果这是您想要的唯一部分,则可以轻松禁用除 Web SSO 之外的所有内容。将所有内容与我的 Web 应用程序集成意味着添加一个请求处理程序,该处理程序将读取 Shibboleth 为我的 SSO 登录页面放置的请求变量。【参考方案3】:我没有使用 Shibboleth 服务提供商的个人经验,但我目前正在开发使用 Shibboleth IdP、Shibboleth 发现服务和 Guanxi Service Provider 的架构。将 Guanxi Service Provider 的轻量级 Guard 模块与 Java webapp 集成是小菜一碟,无需编写自己的模块即可轻松获得基于 Shibboleth 的架构。有localhost tutorial设置关系SP,跳过关系WAYF和IdP部分,用Shibboleth组件代替。
【讨论】:
感谢您的信息。这是我第一次听说关西。不知道是不是免费的? [1]:github.com/guanxi/guanxi-sp-engine/blob/master/README [2]:github.com/guanxi/guanxi-sp-guard/blob/master/README以上是关于如何使用 SAML 和 Shibboleth 实施或集成单点登录的主要内容,如果未能解决你的问题,请参考以下文章
使用 python 登录 SAML/Shibboleth 认证服务器
Shibboleth SP 是 SAML 2.0 的实现吗?
使用ruby-saml从TestShib中“在Shibboleth SSO身份验证请求中没有给出providerId参数”