OpenID Connect 和 IDP 发起的 SSO

Posted

技术标签:

【中文标题】OpenID Connect 和 IDP 发起的 SSO【英文标题】:OpendID Connect and IDP Initiated SSO 【发布时间】:2018-12-05 14:46:48 【问题描述】:

我有一个应用程序,它是一个服务提供者。 是否可以使用 OpenID Connect 实现 Idp 发起的 SSO? 看起来对于 Idp 发起的 SSO,只能使用 SAML,对吗?或者有没有办法让 OpenID Connect 也能正常工作? 我正在考虑使用一些开源工具,例如 Keycloak 或 OneLogin 工具包等。

非常感谢。

【问题讨论】:

是的 - 从技术上讲,IDP-Initiated 是一个 SAML 术语(在 SAML 规范中描述的意义上)。正如@Wiktor 所说,OIDC 是您自己的事。 【参考方案1】:

目前形式的 OpenID Connect 无法实现安全的 IDP 发起的 SSO。然而,有一个名为 3rd-party-initiated-SSO 的功能允许通过 3rd-party 启动身份验证过程,但仍会首先访问 RP。

以下是有关第三方发起的 SSO 的详细信息:

https://openid.net/specs/openid-connect-core-1_0.html#ThirdPartyInitiatedLogin

至于所描述的 IDP-init 建议:行为良好的 RP 应该防止这种情况发生 - 因为从技术上讲它启用了 CSRF - 通过使用 state 参数或(作为不太优选和不太安全的解决方案)通过将请求状态保存在 cookie 中,这使得 RP 仅在请求/响应往返期间容易受到 CSRF 的攻击。

有一个正在进行中的工作,其中描述了(除其他外)如何使用签名消息以安全的方式扩展 OpenID Connect 来实现真正的 IDP-init-SSO:https://datatracker.ietf.org/doc/html/draft-bradley-oauth-jwt-encoded-state#section-4.3

【讨论】:

【参考方案2】:

由于 OpenIDConnect 基于 OAuth2,IdP 发起的 SSO 在技术上应该是可行的,但在一种情况下 - SP 不依赖于在初始请求中传递给 IdP 的状态,其中状态的作用类似于 anti -伪造令牌(即在返回请求时,返回状态与SP在初始请求中发送的状态进行比较)。

更长的答案是:

授权码 OAuth2 流程的第一步是 SP 重定向到 IdP 并且 IdP 使用一次性代码重定向回来。 state 参数通常由 SP 传递,SP 期望将状态传回。

有两种情况。

SP 验证状态(例如,将其与存储在临时 cookie 中的状态进行比较)。 IdP SSO 不起作用,因为 IdP 无法知道/伪造状态,因此它无法向充当 IdP 发起的 SSO 的 SP 发出有效请求。

SP 不验证状态。然后,IdP 可以向常规 OAuth2 请求发出响应,但没有实际请求,即它重定向到

 https://sp.com/oauth2?code=...authcode

SP 从那里选择 OAuth2 握手,就好像它是 SP 来首先启动握手一样。

也就是说,IdP发起的SSO是否可行,只取决于SP。由于spec 建议 使用state 来防止此类行为(归类为 CSRF),我相信您在这里是靠自己的。此外,请阅读有关state 参数可能存在的安全问题的更多信息。

3.1.2.1。身份验证请求 […] 状态 - 推荐。用于维护请求和回调之间状态的不透明值。通常,跨站点请求伪造(CSRF、XSRF)缓解是通过加密将此参数的值与浏览器 cookie 绑定来完成的。

【讨论】:

谢谢维克托。我将不得不消化这一点,因为我不是 SSO 专家。以后我可能有更多问题。再次感谢。 所以让我重新表述一下。如果我遇到这样一种情况,即用户首先登录到他们的组织门户,对其 IDP 进行身份验证,然后单击链接转到我的应用程序,那么实现这一点的最佳方法是通过 SAML?对我来说,这种情况是 IDP 发起的登录,而您说这实际上只能通过 SAML 完成。如果我要使用 OpenID Connect,用户将不得不直接访问我的应用程序,而该应用程序又会通过 SP 发起的身份验证/授权流程重定向到他们的 IDP。这是正确的吗? 您不需要 IdP 启动登录,也不需要 SAML。您只需重定向到应用程序中需要身份验证的任何页面。该应用程序根据协议将用户踢出到 IdP。您确定您了解 IdP 发起的 SSO 的用途吗?这不是针对用户“点击链接”的常见场景,而是针对“用户不点击任何内容,但 IdP 出于某种原因仍然应该能够使用 SP 资源”的场景。 我对 IdP 发起的 SSO 的理解是,当用户单击要重定向到我的应用程序的链接时,他已经登录了。那就是说当应用程序将用户踢出并返回到IdP时,IdP就会知道用户已经登录了。似乎会有一个cookie来回传递,让IdP知道用户不需要显示登录屏幕。但是我不确定是否需要在 Idp 和/或 SP 端配置一些特殊的东西来与经过身份验证的用户一起执行编排。我想这就是我缺乏理解的地方...... 是的,听起来你缺乏了解。 cookie 不会来回传递。相反,IdP 维护一个建立会话的私有 cookie,一旦用户登录一次,他们就不需要再次进行身份验证。如果另一个 SP 带有 常规 OpenID 流,则身份验证端点会回答而不重定向到登录页面。因此,一旦用户登录一次,您就不需要 IdP 发起的 SSO 不一遍又一遍地显示登录屏幕。

以上是关于OpenID Connect 和 IDP 发起的 SSO的主要内容,如果未能解决你的问题,请参考以下文章

如何在微服务架构中使用 3rd 方 IDP 实现 OpenID Connect 身份验证

OpenID Connect 如何处理服务链?

OpenID Connect:使用 response_type 令牌请求范围 openid 是不是错误

使用 openid connect 作为 SSO 用于多个应用程序

OpenID Connect,如果尚未登录,则无需登录表单即可重定向?

SP 发起的 SSO 和 IDP 发起的 SSO 之间的区别