单点登录和 OpenID
上周在石家庄做报告,会后有一个同学对 Single Sign-on 技术非常感兴趣,就在会后进行了交流。
该同学说:
以前没有听说过 SSO, 但是一直有个疑问,为什么不能有一个网站将认证信息统一,其它网站都到那里去登录呢? 听到了 Single Sign-on,觉得这不就是解决方案么?如果谁在公网架设一个 SSO网站,不就实现全网的一次注册了么?我当时回复他,OpenID是实现全网统一认证的解决方案,而不是单点登录,单点登录可以作为 OpenID 实现的基础。OpenID 推行由于公司政治被破坏。
为什么 Single Sign-on 不能实现全网认证整合
Single Sign-on 的实现非常多,可以在 WikiPedia 上搜索 Single Sign-on 的实现方案,可以看到近20种开源的实现:WikiPedia 上关于 SSO 实现的条目。还有更多的企业内部的单点登录实现,例如 Google, 微软等。 SSO 在一个企业/公司的范围内,实现各个系统的认证整合是可行的,但是实现全网的认证整合则不可行。- 一个 Web 应用只能与一个 SSO 服务器整合,对于一个公司/组织的各个应用,这不成问题,但全网认证整合呢?
- 再有 SSO 的实现太多,没有一个统一的协议和标准
- SSO 协议实现的难度
- SSO 的实现可能依赖于 Cookie,涉及到 Cookie 名称校验、发放和匹配等,需要对 Web 应用的认证进行改造,开发量大
- SSO 往往需要特定的协议支持,需要 Web 应用服务器安装插件并进行相应的配置
- SSO 服务器需要对 Web 应用开放特定端口/API,以便 Web 应用能够从服务器获取登录状态信息,影响登录服务器的安全性
为什么 OpenID 可以实现全网认证整合
OpenID 不是一个具体的实现或者产品,而是一个规范,是一个被认可的统一的规范,参见:openid.net 。该规范建立的目的,就是实现全网的认证信息共享。任何公司和组织,都可以根据规范,开发自己的 OpenID provider,将自己的认证用户数据库提供全网“共享”。- OpenID 相比 SSO,是松耦合的认证整合,不会限制于某个认证平台,是更加开放的系统
- SSO 整合的Web应用,和认证中心是紧耦合的,需要应用预先配置认证中心相关设置。能够实现点击即登录,或者直接登录。登录过程无须输入任何和用户名或者认证中心有关的任何信息。
- 而 OpenID 和认证中心是松耦合,应用无须实现和某个认证中心绑定。登录时用户手工输入在任意一个认证中心的 OpenID URL。
- OpenID 使用标准的 HTTPS 协议,并且不依赖于 Cookie。让全网不同架构的Web应用服务器和 OpenID 的整合提供可能
- OpenID 提供了几乎各种语言的API,便于应用在登录中增加 OpenID 登录功能
OpenID 推行的政治障碍
OpenID 协议推出已有多年时间,但是离真正的全网认证整合尚有不少距离。其中有技术原因:在登录时需要输入长长的URL,而非用户熟悉的用户名。但是最主要的是政治原因:- 没有一个网站愿意或者说胆敢放弃用户资源,因此大的网站都争相提供 OpenID provider 功能,但是绝不支持来自第三方 OpenID Provider 的认证。所以在互联网巨头的网站,还是需要老老实实的注册和专用账号登陆。 想想一下,如果 Google 的认证支持来自微软MSN用户帐号登录,那么Google的注册用户量的增长就岌岌可危了
- 为了方便登录(不必输长长的URL),或者别的原因,很多 OpenID provider 的实现都对标准进行了扩展,这就造成OpenID登录对话框越来越复杂。
OpenID 不能取代单点认证
对于企业自身的各个业务平台,单点认证要比OpenID更适合:- 业务平台基于单点登录的认证整合,可以实现从任意一点登录,其他平台自动登录。
- 使用OpenID认证的应用系统不能实现单点登录功能,每个应用的登录,还需要输入一个URL格式的登录ID。
- 单点登录系统同时还支持单点登出。但是 OpenID 在单点登出上没有涉及。
企业认证中心引入OpenID?
单点登录绝对应该是企业认证中心的第一需求。那么企业还需要 OpenID 么?增加 OpenID 支持后,会有什么好处么? 我认为将认证中心作为 OpenID provider 是企业的可选项,会改进用户体验:- 员工在企业内网用户管理平台注册,可以使用外网的 OpenID provider,简化注册流程,用户个人信息自动获取。
- 员工在使用企业之外的互联网应用(支持OpenID),注册或者登录时,可以使用企业内部认证中心作为 OpenID provider,实现在外网应用的注册和登录流程的简化
- 企业内部新的应用若支持 OpenID,则无须进行单点登录的改造,直接使用 OpenID 登录方式实现认证的整合。但是这种方式的登录不能实现自动登录,还需要手工输入 OpenID 的 URL。