最近半年设计实现了一个单点登录系统(TnSSO),这是一个很常见的系统,但我们在功能与体验上有很多深入精细的探究,这里总结记录一下。下文中SSO也指代本系统。

TnSSO为PC版和移动版各提供多种登录方式,有常规的邮箱账号或手机号登录,有使用新浪、QQ等账号的联合登录,也有使用手机动态口令登录,另外还针对不同平台也各提供了一些特色登录方式来提升用户体验,比如微信中打开公司的分享链接可以使用微信授权直接登录,而在PC页面则是扫码登录。

现在移动端的App页面,很多都是直接将普通移动版网页内嵌在App中,App扮演着一个浏览器,这样的好处不必多说。因为App原生页面登录方式的体验优于在App中打开网页再登录,所以我们在App中还保留使用原生页面登录。TnSSO实现了与App原生登录方式的兼容,可以识别App中用户的登录状态。另外也可以使用App扫码登录PC版SSO。

下面是一张单点登录的时序图,具体就不再解释了,之前没有接触过的看图也应该可以理解是怎么一回事:

安全与体验

TnSSO在安全和体验方面都有一些很精细的考量,在保证系统安全性的前提下,最大程序的优化用户体验。
1、全程HTTPS,防止客户端与服务器之间的通信被窃听。
2、设置回调URL设置白名单,客户端子系统接入SSO必须先在SSO登记注册。
3、token一次性有效,且与客户端子系统绑定,使用后立即销毁。
4、为提升用户体验,每IP每天前3次登录,或每个手机号每天第一次发送动态口令,都不需要用户输入验证码。
5、一个验证码重复发送手机动态口令超过3次后失效。
6、等等…

兼容App登录

App的用户登录信息是单独保存在App中的,并没有使用SSO提供的公共登录服务。那么用户通过App访问内嵌网页时,网页是怎么知道用户的登录状态,怎么实现内嵌网页和App登录状态的共享呢?

我们的解决方案是,在App访问内嵌的要求登录的页面PageA时,PageA会302跳转到SSO的登录页面,这个过程都是在App中进行的,App在访问SSO的登录页面时会在Cookie中加入一个hash值。SSO接收到请求后先判断SSO自身是否处于登录状态,如果没有则拿Cookie中的hash值去App服务器请求用户ID,在取到用户ID后生成用户登录信息,再带上token跳转PageA所在系统WebA的回调URL,WebA重复上面的登录过程就可以登录了。如果hash值为空或者根据hash值从App服务端取回的用户ID为空,则跳转到一个用于被App劫持的URL,在App完成登录后再重复上述流程。

App在Cookie中设置一个hash值而不是直接设置用户ID,是为了安全考虑,SSO自己调接口从App服务端取回的用户ID才能保证合法性,才是值得信任的。
时序图如下:

扫码登录

扫码登录是现在很流行的一个做法,用户已经在自己的手机或其它移动设备一直处于登录状态,而且这是值得信任的,用它来为PC版登录提供一个快捷方式,简单快捷体验好,用户不需要再输入冗长复杂的可能用户自己都记不住的密码。所以这种登录方式也是我们必须提供的,虽然现在还没有正式发布上线,但早已经规划设计。
具体的实现方式是,SSO服务器先随机生成一个不会冲突的code存入数据库,并将它绘制成二维码图片显示在PC版登录页面,页面使用Javascript短轮询的方式向服务器查询这个code的对应的登录信息。App使用内置的扫码功能识别出图片中的code,然后通过App服务端将code和上文提到的用户登录信息的hash值作为参数请求SSO接口。SSO收到请求后先判断这个code在我们数据库中是不是存在,存在则表示请求合法,然后再以hash值请求App服务器获取用户ID,后面的流程就是上文的与App登录连通差不多了。JS轮询到用户已登录后刷新页面,或者从哪里来就跳转回哪里去。

最后,TnSSO其实不仅仅提供统一登录服务,还集成用户注册、密码找回等功能,所以称之为通行证系统更合适一点,是公司内稳定性和安全性等方面要求最高的系统。

一个单点登录系统设计相关推荐

  1. 如何设计一个单点登录系统

    本文来说下如何设计一个单点登录系统 文章目录 概述 JWT的组成 头部(Header) 载荷(Payload) 签名(签名) 签名的目的 信息会暴露 JWT的适用场景 用户认证八步走 和Session ...

  2. SSO单点登录系统设计,数据库设计文档

    SSO 系统设计文档 1 .SSO 数据库设计 1.1 SSO用户表 ssoUsers 字段名 中文名称 字段类型 说明 ssoUserId 序号 Int(4) PK,自增 ssoLoginId SS ...

  3. 单点登录系统设计及实现

    单点登陆系统设计及实现 1 系统简介 1.1 http协议 web应用采用browser/server架构,http作为通信协议.http是无状态协议,浏览器的每一次请求,服务器会独立处理,不与之前或 ...

  4. 写了一个 SSO 单点登录的代码示例给胖友!

    发危~ " 摘要: 原创出处 http://www.iocoder.cn/Spring-Security/OAuth2-learning-sso/ 「芋道源码」欢迎转载,保留摘要,谢谢! 1 ...

  5. javaweb实现单点登录,防止重复登录,获取sessionid,对session及时销毁回收,只允许一个用户登录,结合struts2实现

    首先我们目的是实现一个单点登录,即只允许单个账户单个登录. 实现异地与同地登录判断 要将先登录的用户强制下线.不免用到session. 单点登录的最大难题:已经登录且重复登录的用户的session怎么 ...

  6. asp.net 使用application实现单点登录(一个账号只能在一个地方登录)

    登陆用户名密码验证通过之后输入以下代码: Hashtable hOnline = (Hashtable)Application["Online"]; if(hOnline != n ...

  7. 单点登录系统实现基于SpringBoot

    今天的干货有点湿,里面夹杂着我的泪水.可能也只有代码才能让我暂时的平静.通过本章内容你将学到单点登录系统和传统登录系统的区别,单点登录系统设计思路,Spring4 Java配置方式整合HttpClie ...

  8. .net core 1.0 实现负载多服务器单点登录

    前言 .net core 出来有一时间了,这段时间也一直在做技术准备,目前想做一个单点登录(SSO)系统,在这之前用.net时我用习惯了machineKey ,也顺手在.net core 中尝试了一上 ...

  9. 基于IdentityServer4的OIDC实现单点登录(SSO)原理简析

     # 写在前面 IdentityServer4的学习断断续续,兜兜转转,走了不少弯路,也花了不少时间.可能是因为没有阅读源码,也没有特别系统的学习资料,相关文章很多园子里的大佬都有涉及,有系列文章 ...

最新文章

  1. jquery 判断一个对象是否存在
  2. C#中Delegate和Event以及它们的区别(转载)
  3. Endnote技巧:解决中英参考文献混排问题,附国标文件
  4. Tomcat启动问题,启动是Tomcat8,结果却是Tomcat9
  5. 漫游Kafka入门篇之简单介绍
  6. 一二三系列之优先队列、st表——Battle,Heapsort,A Magic Lamp
  7. mvc试图 下拉框不重复_面试前不巩固一下基础知识、刷刷题吗?
  8. android onSaveInstance方法项目中的实践
  9. sh执行文件 参数传递_shell中脚本参数传递的两种方式
  10. MyBatis 持久化框架快速使用入门(Xml配置版)
  11. OA与EHR系统集成方案
  12. arcgis许可服务器不运行,ArcGIS许可服务管理器无法启动问题解决方法
  13. Unity的一些特效和粒子特效插件
  14. 如何将视频的语音变成文字播放出来?
  15. Android音视频【三】硬解码播放H264
  16. poi-tl实现word文档按模板下载
  17. 校招社招互联网面试经验总结
  18. 重读《由C#风潮想起的-给初学编程者的忠告》有感 (转载)
  19. 坪山体育中心体育馆全景不同高度展示
  20. UVa 10110 灯光

热门文章

  1. 计算机网络安全概述(论文)
  2. Linux:两种非交互修改用户密码的两种方式
  3. 深入理解计算机系统_00
  4. java rmi端口_RMI IP绑定和端口固定
  5. 发改委印发三年行动计划 智能机器人有望成为下一片蓝海
  6. STM32开发 -- RTC详解
  7. objectArx --- 工具类
  8. centos7 应用笔记: fslint 文件查重
  9. 用c语言实现三子棋,它来了!!
  10. Unity使用FBX Exporter导入导出动画及FBX