【问题标题】:Select Identity Provider Locally with Spring Security's SAML 2.0使用 Spring Security 的 SAML 2.0 在本地选择身份提供者
【发布时间】:2021-12-22 17:39:04
【问题描述】:
我正在使用 Spring Security 的 SAML 2.0 将我的服务提供者连接到多个身份提供者。
Spring's SAML 2.0 documentation 中的所有内容都有意义。我已经阅读了很多有用的教程including this one,这些教程与我现有的代码相似。
但是,我错过了在哪里以及如何为给定用户选择身份提供者。
我了解SAMLDiscovery 可用于将身份提供者选择委托给第三方服务。我也了解如何配置多个身份提供者。但我正在寻找一种方法来运行我自己的代码(即检查数据库),然后为所选身份提供者(而不是第三方服务)触发 SAML 请求。我预计在SAMLEntryPoint 被击中时会出现这种情况。我已经看到提到在初始请求中指定 EntityID。这有关系吗?
我正在尝试执行 SP 发起的 SAML 2.0 SSO。有人可以指点我我可以在哪里根据当前用户手动指定 IdP 吗?
【问题讨论】:
-
如果您知道给定用户的 IdP,您需要做的就是用正确的“材料”构造一个 SAML 请求。对于简单的场景,IdP 的实体 ID(在请求中成为 Issuer)是您识别 IdP 所需的全部/大部分。 Spring 根据客户端注册 ID 为您完成所有这些工作:请参阅 doc
标签:
java
spring
spring-security
saml-2.0
spring-security-saml2
【解决方案1】:
据我所知,SAML 没有提供任何机制来满足您的需求。
SAML 发现用于找出您的应用程序存在哪个 IdP。
您的问题是在用户尝试登录之前您不知道用户是谁,而当他这样做时,这意味着他已经知道他想使用哪个 IdP。
所以你有以下选择:
- 最常见。使用允许用户选择要使用的 IdP 的登录页面。例如,Epic games 允许您从 8 个列表中选择 IdP。一旦用户选择它,您就可以将他的请求定向到正确的 IdP。
- 如果您事先知道哪个用户属于哪个 IdP,那么您可以拥有一个页面,只允许用户输入他的用户名。一旦他这样做了,您就可以在您的数据库中检查该用户所属的 IdP 并将重定向消息发送回浏览器。虽然这可行,但它不允许用户选择要使用的 IdP,将这项工作置于后端的肩上。
- 执行第 2 步并在用户浏览器中保存一个 cookie。然后,当用户尝试从同一台机器再次登录另一个会话时,您可以自动将他重定向到正确的 IdP。使用此选项,一切都会自动完成,除了第一次。
需要考虑的一件事。从安全的角度来看,向黑客提供任何信息都是一种不好的做法,因此选项 2,3 确实向黑客揭示了哪个 IdP 属于哪个用户。 IMO 这不是什么大的违规行为,可以实施。
【解决方案2】:
这并不是一个真正的 SAML 问题,因为任何解决方案都会在标准之外发生,并且涉及在要求用户进行身份验证之前识别用户。
一般模式
- 应用使用技术 A 重定向到服务提供商,例如 SAML、OpenID Connect
- 对于这个应用程序,服务提供商被配置为运行一个动作,例如显示一个屏幕,以识别用户 - 您可能已经在 Office365 等系统中看到了这一点
- 服务提供商然后使用某种数据查找来识别下一步的 IDP
- 如果有多个,则提示用户选择一个,否则将自动调用默认选项
- 然后服务提供商使用技术 B 重定向到 IDP - 可能是 SAML / OIDC / 其他
可扩展性
希望我上面的 cmets 表明 IAM 系统是一个工具箱并且应该是可扩展的。我在 Curity 工作,我们使用可以组合的身份验证器和操作的概念 - 例如对于 MFA,但常见的选项如下:
- 获取用户名
- 运行一些自定义逻辑 - 例如调用数据查找以设置下一个身份验证器的 JavaScript
这里有一个recent article 来展示它是如何工作的 - 用户名验证器是有趣的部分。
供应商
很遗憾,Spring 可能无法提供您想要的选项。不过,这应该稍微澄清一下您的要求。