将基于SAML的SSO与第三方服务提供商集成

时间:2020-10-20 14:37:48

标签: spring-boot spring-security single-sign-on saml spring-security-saml2

我们必须为SSO集成第三方SP。我们的应用程序是spring的包装器(不是springboot),它具有使用mongo作为DB的调用后端服务的身份验证/授权模块。 现在的要求是将基于SSO SAML的SP与第三方集成。第三方提供了要求具有IDP的文档。在SP提供的要求中,Nameid断言必须是持久的,唯一且不透明的,并且可以是客户端应用程序(我们的应用程序)的用户ID。 我相信我们必须拥有SSOCircle或Okta之类的IDP或一些开源IDP才能与SP集成。而且我认为我们可以编写一个单独的springboot SAML IDP,并将api暴露给我们的旧版spring,以便登录到SP。 据我了解的流程:

  1. 我们门户网站中的用户访问第三方SP网站或API。
  2. 第三方SP将用户重定向到我们的IDP进行登录。他们将​​在其末尾保存NameId(用户ID或用户ID的UUID映射),并将其作为SAML请求与其他声明一起传递。
  3. 用户成功登录后,我们的IDP会将用户重定向到具有成功响应的第三方SP。

我的问题:

  1. 我们可以(或应该)绕过IDP吗?我想这意味着我们将自己编写SAML IDP。请让我知道我的最佳选择,或者如果没有IDP并写我们自己的等效文件,这是否是个好主意。如果不能,我会假设我们已经购买了付费专有或使用开源IDP。
  2. Nameid(唯一,持久,不透明)声明:这是SP的要求之一。如果我们必须使用IDP(我认为),并且SP消费者声明要求是使用持久的Nameid进行传递。独特,持久且不透明。因此,我们认为SAML请求中的用户ID到IDP的UUID映射应该可以。如果这样,我们必须将UUID映射作为nameid assertion存储在DB中。为了满足要求,我们是否仅需在DP -SP集成中将门户网站用户ID用作nameIds或UUID?请评论哪种方法正确。
  3. 在IDP端和SP端的Nameid持久性限制:在我们的一端存在一个瓶颈。由于安全方面的考虑,我们的IT安全团队可能永远不允许NameId持久性映射UUID,在这种情况下,NameId映射将在我们的结局。如果我们必须使用UUID作为nameid,应该如何解决?
  4. NameId设置:当用户从我们的门户网站请求登录到SP时-是否将其作为登录请求传递给SP,然后SP构造saml请求并将nameids断言传递给IDP?如果是,将nameids作为登录请求传递给SP的最佳方法是什么?如果否,SP将如何知道将SAML中的UUID传递给IDP?如果映射名称ID是UUID(由于安全问题而可能更改),我们将如何解决? 。另一件事是,虽然提到nameid在需求中被提及为“永久”,但是在需求doc的示例中,它们显示urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified。我认为那可能是文​​档错误。 [?]。
  5. 我们可以参考的任何样本SSO SAML IDP(客户端)应用程序都接近1)和2)?

1 个答案:

答案 0 :(得分:0)

我们可以(或应该)绕过IDP吗?我想这意味着我们将自己编写SAML IDP。

不,您不能。如果第三方充当SAML服务提供者,则您需要或充当SAML身份提供者。构建自己的实现是一项艰巨的任务,您既可以使用基于SSAS Cirle的基于SAAS的IdP(请注意,您的客户需要接受存储用户身份数据的位置),也可以部署自己的SAML IdP。有付费产品/服务或免费。开源不一定意味着免费,这经常被误解。

如果仍然需要SAML IdP,则可以考虑使自己的应用程序充当SAML SP,以利用IdP的身份验证。

使用哪种NameId格式是一种协议。 SAML规范建议出于特定目的使用特定NameId格式,例如

  • “临时” NameId格式仅用于SSO流。
  • “持久”是用于要将不同身份孤岛的身份链接在一起的情况

SP可以在主题中使用NameId值的值来查找用户的个人资料或执行自动联合(在其侧面建立个人资料)。它还可以使用SAML属性语句中的属性来实现相同目的。许多SP实现都提供了这一点。