OpendID Connect和IDP启动的SSO

11
我有一个应用程序是服务提供商。是否可能使用OpenID Connect实现IdP启动的SSO?
看起来只有SAML可以用于IdP启动的SSO,这是正确的吗?还是有一种方法让OpenID Connect也能正常工作? 我正在考虑使用一些开源工具,比如Keycloak或OneLogin toolkit等。

非常感谢。


是的 - 从技术上讲,IDP-Initiated 是 SAML 术语(在 SAML 规范中有描述)。正如 @Wiktor 所说,OIDC 方面您需要自己解决。 - rbrayb
2个回答

9

在目前的形式下,OpenID Connect无法实现安全的IDP启动SSO。但是,有一个名为第三方启动SSO的功能,允许通过第三方启动身份验证过程,但仍然首先访问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

8
由于OpenIDConnect基于OAuth2,理论上应该可以进行IdP启动的SSO,但有一个条件——SP不依赖于在初始请求中传递给IdP的状态,其中状态起到了防伪标记的作用(即在返回请求时,返回状态与SP在初始请求中发送的状态进行比较)。
更详细的答案如下:
OAuth2授权代码流程的第一步是SP重定向到IdP,并且IdP使用一次性代码重定向回来。通常由SP传递state参数,并期望将状态传回。
有两种情况。
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. Authentication Request […] state-建议。不透明值用于在请求和回调之间保持状态。通常,通过将此参数的值与浏览器cookie加密绑定来执行跨站点请求伪造(CSRF,XSRF)缓解。


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接