现代身份指南
Search…
⌃K

第十一章 单点登录SSO

什么是SSO 单点登录

单点登录是指用户无需再次登录即可进行一次身份验证并访问多个应用程序的能力。它通常通过使用身份提供商启用。本章将重点介绍SSO,并假设一组应用程序使用OIDC或SAML 2.0,使用相同的身份提供程序并通过相同的浏览器访问,或者,对于本机应用程序,在将身份验证委托给身份提供程序时,至少使用相同的浏览器。经过身份验证后,只要用户的身份提供程序会话(SSO会话)未过期或终止,用户就可以享受对应用程序的单点登录访问。
单点登录可以帮助多种情况。例如,在面向消费者的环境中,用户可能享受跨多个应用程序的单点登录,这些应用程序允许用户通过Google登录。在企业环境中,员工可能享受跨内部和云应用程序的单点登录,这些应用程序利用其公司身份提供商进行身份验证。在大学里,学生、教授和管理员可以利用大学身份提供商在大学应用程序之间进行单点登录。
单点登录提供了许多好处。对于用户来说,单点登录提供了不必经常进行身份验证的便利,需要记住的用户名和密码更少,并且不会向应用程序公开其凭据。应用程序所有者可以将实现登录页面、凭据验证、凭据的安全存储和一些帐户恢复功能的工作委托给身份提供商。对于企业或组织,单点登录还提供了一个单一的位置,在该位置可以实施和强制实施身份验证策略、不同形式的身份验证、帐户恢复、日志记录和帐户终止。在一个地方实施最佳实践比在许多单独的应用程序中更容易。SSO还提高了安全性,使得只需记住一个密码的用户不太可能将其写在众所周知的便笺或白板上。
但是,单点登录并非是一个完全没有缺点的方案,实施单点登录需要一些利弊的权衡。实现单点登录将创建一个到应用程序的网关,该网关有可能成为单点故障,集中式服务还可能成为集中的被攻击点。为了降低这些风险,必须选择一个设计为高可用性并实施安全最佳实践的身份提供程序。身份提供商还能够了解用户活动,并能够跨站点跟踪用户,这可能会涉及到隐私问题。在选择身份提供商时,用户和企业应在将其应用程序的身份验证委托给提供商之前,对提供商的隐私功能和安全性需要进行详尽的调查评估。

单点登录 SSO的工作原理

如图11-1所示,用户访问应用程序A,该应用程序通过身份验证请求将其浏览器重定向到身份提供商。身份提供程序对用户进行身份验证,为用户建立会话,并在用户浏览器中创建包含会话信息的cookie。然后,它将用户浏览器重定向回具有需要安全令牌的应用程序A,并返回包含有关身份验证事件和用户的数据。然后,应用程序就可以为用户创建或更新自己的本地会话(可能还有cookie)。
11-1 SSO.png
如果用户随后使用同一浏览器访问应用程序B,第二个应用程序会检测到用户尚未登录,并将用户重定向到身份提供商。因为用户的浏览器中已经包含身份提供程序的cookie,因此身份提供程序使用cookie来检测用户是否登录,是否在身份提供程序处已经拥有经过身份验证的会话。它检查用户的会话是否仍然有效,如果仍然有效,则使用通过浏览器将应用请求的安全令牌重定向回应用B,而不提示用户提供凭据。这样,应用B就可以根据返回的令牌为用户创建或更新本地会话(可能还有cookie)。只要他们在身份提供程序上的会话(通常称为SSO会话)保持有效,用户可以继续访问后续应用程序或返回前两个应用程序,而无需再次登录。
用户会话可能无效的原因有很多,可能是会话超时,或者,该会话由管理员在身份提供程序处终止,或者用户注销了身份提供程序处的SSO会话,或者用户从一个应用程序注销,该应用程序触发注销请求以结束身份提供程序会话。我们后续将详细介绍有关注销场景。无论出于何种原因,如果用户通过身份验证请求重定向到身份提供商,并且其会话不再有效的情况下,身份提供程序将提示用户重新身份验证(除非请求包含用于抑制活动身份验证的身份验证请求参数)。
即使存在有效的SSO会话,在某些情况下用户仍必须与身份提供者交互。如果应用程序需要代表用户去请求API,并且身份提供商也是API的授权服务器,则身份提供商将需要弹出相应的授权同意页面,提示用户同意授权应用去调用对应的API。如果,当前建立会话的认证方式强度不够,或者应用会话建立需要更强或不同的身份验证形式,则将需要提示用户满足新应用程序的身份验证要求。如果应用程序在其身份验证请求中包含强制身份验证的参数,则用户将需要重新身份验证。类似地,可以使用参数指定活动身份验证之间可以经过的最大时间长度,这也可以触发用户重新身份验证的需要。在没有此类特殊情况的情况下,SSO允许用户在验证一次后访问多个应用程序,直到其SSO的会话过期。

SSO 会话属性

当实施单点登录时,需要配置IDP支持配置多个功能,从会话持续时间,身份验证机制的强度,登录页面品牌设置,和终止会话的机制,都需要有仔细的设置。

SSO会话时长

应配置SSO会话的长度,通常以最大超时和空闲超时来指定。当然,应用程序具有不同的敏感性,可以适应具有不同需求的应用程序需求,做出不同的响应。如果使用OIDC的应用程序需要用户更频繁地进行主动身份验证,则身份验证请求中的“max_age”参数可用于指定自用户上次主动身份验证以来所允许的最长时间(以秒为单位),通常比身份提供程序会话的时长要短。如果身份验证请求中的“max_age”值小于用户上次身份验证后经过的时间,则使用此参数要求身份提供程序再次主动对用户进行身份验证。应用程序仍应检查ID令牌中的身份验证时间声明,以确保遵循了请求的“max_age”。
对于非敏感的应用,应用也可通过使用更长的应用会话时长,即便是身份提供程序会话已经结束,用户在应用程序中也可以保持活动状态,

多个身份服务提供商

在某些情况下,会存在配置多个身份提供程序的身份源的情况,这时需要使用到身份代理实现SSO,身份代理应确保每个身份提供程序的用户只能登录到他们的被授予访问的应用程序。 例如,如果一家公司有一个身份验证代理,其中一个身份提供者为员工配置,另一个为合作伙伴配置,则该配置应确保合作伙伴无法访问仅针对员工的应用程序。 该场景如图11-2所示。在此示例中,应用程序A只能由身份提供程序A认证的用户访问。应用程序B只能由身份提供程序B认证的用户访问。由登录到身份提供程序B的用户建立的SSO会话则不允许访问应用程序A。
11-2 Multi IDP.png
11-2 IDP 代理

认证机制

根据不同的应用的敏感程度,应该可以配置不同的认证机制。例如,有的应用程序可能只需要用户名/密码登录,而其他的应用程序可能需要更强大的身份验证形式,如一次性密码。

登录页品牌

就用户体验而言,SSO会话的登录页面应明确展现用户登录的内容,如Logo,告知信息,公司主体等等。例如,如果员工被重定向到公司身份提供商,则在登录页面展示公司的品牌信息,这对于用户体验会很有帮助。

本章重点回顾

单点登录为用户提供了便利,并为身份验证策略提供了集中管理点。从安全角度看,单点登陆实现了对于应用的登录凭证的隐藏,同时也让开发人员避免反复的开发登录逻辑和页面,降低安全风险。当然,应用程序所有者应确保身份提供商的单一登录会话的认证机制与会话持续时间和当前应用的安全要求相匹配。