一:什么是单点登录(single Sign-On)
SSO 是一种统一认证和授权机制,指访问统一服务器不用应用中的受保护资源的同一用户,只需要登录一次,即通过一个应用中的安全验证后,
再访问其他应用中的受保护资源时,不再需要重新登录验证。
二:单点登录解决了什么问题
解决了用户只需要登录一次就可以访问所有相互信任的应用系统,而不用重复登录
例如:CSDN中的论坛应用,博客应用,下载应用模块。我们只要在CSDN中访问任何一个应用后,再访问其他应用站点的时候就不需要重新登录
三:总结在项目开发中的一些体会。看如下流程图:
一:用户第一次访问站点。
1.用户第一次访问>www.a.com,这个时候站点下没有记录之前登录的Cookie
2.所有在发现没有用户登录的情况下>跳转到Login页面
3.用户现在输入用户名,密码登录,请求SSO登录API,登录成功,在Redis里面缓存一条Key=SessionID,Values = UserInfo这样一条记录,缓存时间可配置。Response返回登录验证状态,和用户信息。
4.用户登录成功,记录下凭证,即此刻的SessionID写入Cookie,然后跳转到www.A.com
5.这时候有了Cookie,将记录的Cookie,也就是SessionID请求SSO验证token接口,因为登录成功记录了Key=SessionID,所以可以获取到Values = 用户信息,Response返回用户信息
6.用户现在去访问www.B.com站点,B站点无Cookie,这里的SessionID还是当前会话的SessionID,所以去请求SSO 主站点验证Token接口,发现存在Key=SessionID,返回登录状态成功,用户信息。在B站点下记录Cookie即token配置
这样用户第一次访问A站点,从第一次登录,到访问其他站点的流程就走完了
二:用户中途关闭浏览器,然后打开浏览器,访问B站点
1.发现存在Cookie,即Token凭证,去SSO站点,验证发现存在Key=SessionID,获取Values 讲UserInfo返回给用户,返回用户在登录状态。这样访问应用之前访问过的站点依旧在登录状态
2.如果用户在执行访问第二个应用,这个时候redis缓存的登录状态过期,则返回凭证验证失败。这个时候第二个应用跳转到登录状态,走用户登录的流程以及后续的验证流程
注意:记录Cookie的过期时间应该保证与redis的过期时间一致,不能在redis过期时间之后过期,这样在用户此时访问第一个应用站点的时候,发现Cookie不存在,就会通过SessionID去验证凭证,发现这时候是过期重新登录,会讲此时的登录状态写入Cookie.
三:登出
只需要清除本地Cookie,调用SSO站点接口清除登录缓存的状态即可实现登出
四.注意:
在实际的项目开发中会遇到各种情况,比如子站点和SSO主站点的接口调用参数约束,签名,加密等。以及纯html站点的实现SSO登录接口,或者 纯.NET应用网站的跳转接口,这些都要区别开来。只有在详细了解SSO实现单点登录的原理之后进行开发才能做到事半功倍的效果。