OpendID Connect 和 IDP 发起的 SSO

use*_*018 6 authentication saml single-sign-on openid-connect

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

非常感谢。

Wik*_*hla 8

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

\n\n

更长的答案是:

\n\n

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

\n\n

有两种情况。

\n\n

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

\n\n

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

\n\n
 https://sp.com/oauth2?code=...authcode\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

换句话说,IdP发起的SSO是否可行,仅取决于SP。由于规范 建议使用state来防止此类行为(在那里分类为 CSRF),我相信您在这里只能靠自己了。另外,请阅读有关该state参数可能存在的安全问题的更多信息。

\n\n
\n

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

\n
\n


Han*_* Z. 5

当前形式的 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 : //tools.ietf.org/html /draft-bradley-oauth-jwt-encoded-state#section-4.3