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:使用 response_type 令牌请求范围 openid 是不是错误
使用 openid connect 作为 SSO 用于多个应用程序