单点登陆SSO的实现原理

单点登陆SSO(Single Sign On)说得简单点就是在一个多系统共存的环境下,用户在一处登陆后,就不用在其余系统中登陆,也就是用户的一次登陆能获得其余全部系统的信任。单点登陆在大型网站里使用得很是频繁,例如像阿里巴巴这样的网站,在网站的背后是成百上千的子系统,用户一次操做或交易可能涉及到几十个子系统的协做,若是每一个子系统都须要用户认证,不只用户会疯掉,各子系统也会为这种重复认证受权的逻辑搞疯掉。实现单点登陆说到底就是要解决如何产生和存储那个信任,再就是其余系统如何验证这个信任的有效性,所以要点也就如下几个:html

  • 存储信任web

  • 验证信任django

只要解决了以上的问题,达到了开头讲得效果就能够说是SSO。最简单实现SSO的方法就是用Cookie,实现流程以下所示:跨域

否则发现以上的方案是把信任存储在客户端的Cookie里,这种方法虽然实现方便但立马会让人质疑两个问题:缓存

  • Cookie不安全安全

  • 不能跨域免登分布式

对于第一个问题通常都是经过加密Cookie来处理,第二个问题是硬伤,其实这种方案的思路的就是要把这个信任关系存储在客户端,要实现这个也不必定只能用Cookie,用flash也能解决,flash的Shared Object API就提供了存储能力。memcached

通常说来,大型系统会采起在服务端存储信任关系的作法,实现流程以下所示:网站

以上方案就是要把信任关系存储在单独的SSO系统(暂且这么称呼它)里,提及来只是简单地从客户端移到了服务端,但其中几个问题须要重点解决:加密

  • 如何高效存储大量临时性的信任数据

  • 如何防止信息传递过程被篡改

  • 如何让SSO系统信任登陆系统和免登系统

对于第一个问题,通常能够采用相似与memcached的分布式缓存的方案,既能提供可扩展数据量的机制,也能提供高效访问。对于第二个问题,通常采起数字签名的方法,要么经过数字证书签名,要么经过像md5的方式,这就须要SSO系统返回免登URL的时候对需验证的参数进行md5加密,并带上token一块儿返回,最后需免登的系统进行验证信任关系的时候,需把这个token传给SSO系统,SSO系统经过对token的验证就能够辨别信息是否被改过。对于最后一个问题,能够经过白名单来处理,说简单点只有在白名单上的系统才能请求生产信任关系,同理只有在白名单上的系统才能被免登陆。

以上只是提供了些简单的实现技术,但须要强调的是这只是技术实现而已,仅仅是为了解决上面谈到的一些问题,SSO自己来讲并非什么高科技,有了这个认识比较有利于咱们深刻探索SSO

其余有关sso文章:

CAS单点登陆(SSO)完整教程 http://my.oschina.net/u/1029594/blog/151249

django多网站用户一致认证方案  http://www.myexception.cn/internet/1573427.html

相关文章
相关标签/搜索