2017编程提高第4.5节课——Web SSO
LanyuanXiaoyao's Blog ヽ(✿゚▽゚)ノ

2017编程提高第4.5节课——Web SSO


Web登录的本质是什么?

  • HTTP是个无状态的协议
    • 什么是无状态?

如何增加状态/会话

单个系统的登录

扩展到多个系统:SSO

  • 目标:在一个系统上登录一次,访问别的系统就不用登录了
  • 约束
    • 系统架构,语言可能不同
    • 域名可能不同

方案1: 共享cookie

共享cookie的问题

  • Cookie不能跨域
    • abc.com 产生的cookie不能被xyz.com访问
    • 域名映射
      • abc.com à abc.sso.com
      • def.com ->def.sso.com
  • Session复制非常麻烦
  • 如果系统是异构的, 后台共享session很难做
    • C# , PHP, Java , Python

方案2: 共享cookie , 后台不共享session

做签名

优缺点

  • 登录状态存放在客户端
    • 服务器端没有管理session的负担
  • 各个系统所用的签名算法必须相同
    • 密钥也必须相同
    • 密钥的分发,定期刷新?

使用独立的认证中心

登录了系统A以后,再来访问B系统

退出登录

CAS(Central Authentication Service)

  • 耶鲁大学发起的开源SSO
  • 几个核心概念
    • CAS Server/CAS Client
    • Service
    • TGT:Ticket Granting Ticket
    • ST:Service Ticket

超时的问题

安全性

  • 非常依赖SSL, 通信都应该使用https来进行
  • Ticket 安全性
    • 只能只用一次
    • 过段时间失效,例如5分钟
    • 需要足够随机

再思考一下CAS

这种方式怎么样?

  1. 用户访问www.a.com/pageA
  2. 系统A发现用户没有登录, 重定向到认证中心
  3. 认证中心验证用户提供的用户名和密码, 登录成功
  4. 认证中心形成一个xml消息, 对消息做签名,然后发给系统A(www.a.com)
  5. 系统A对xml消息做验证, 发现消息合法, 认为用户已经登录, 可以访问pageA了

问题 : 系统A 如何对认证中心发送的消息做认证

SAML

互联网的”SSO”

  • 互联网特点:
    • 高度分散化:不可能有一个控制所有网站登录的认证中心
  • 每个网站都要求注册一个账号
    • 太多了,记不住账号,密码
    • 使用同一套用户名/密码, 一旦某个网站泄密,会影响所有的网站
  • 用户能不能在一个网站(或者几个)上注册以后,就拿着这个(username,password) 登陆别的网站?
    • 一次注册,到处登陆
  • 可是其他网站如果只是看到毫无意义的username, password, 什么事情也干不了, 没法做认证。
  • 用一个中间层来解决?

OpenID

  • 一个网站可以用URL来唯一标识
  • 一个用户能不能也用URL来标识?
    • www.aol.com/liuxin](http://www.aol.com/liuxin)
    • liuxin.yahoo.com
  • 用户(End User)
  • Identifier
    • www.aol.com/liuxin](http://www.aol.com/liuxin)
    • liuxin.yahoo.com
  • 身份提供者 Identity Provider (IdP)
  • 依赖方/消费者 (Relying Party/Consumer)

OpenID 的流程

  1. Bob  想访问一个网站(a.com), 但是Bob 没有在这个网站上注册过。 该网站支持OpenID登录。  Bob 碰巧有个OpenID的账号bob.yahoo.com
  2. Bob 在该网站上点击了 “使用OpenID登录“, 并且输入 : bob.yahoo.com.
  3. 网站获取HTML, 得到 identity provider <link rel = “openid.server”,href=“https://yahoo.com/openid”>
  4. 网站和yahoo.com建立一个共享的密钥 使用 Diffie-Hellman key exchange
  5. 重定向Bob的浏览器,访问https://yahoo.com/openid
  6. yahoo.com 收到认证请求, 要求Bob登录
  7. Bob提供密码,在yahoo.com上登录
  8. yahoo.com 要求Bob确认是否信任a.com
  9. Bob 选择“确定信任”
  10. Bob的浏览器被重定向回a.com 其中包含用户认证的响应消息
  11. a.com 对响应消息进行验证, 通过的话展示Bob要访问的页面

讨论

  • 在第7步, 为什么让用户确认是否要访问a.com呢?
  • 在第9步, yahoo.com 怎么知道把用户的浏览器重定向到哪个url ?
  • 在第10步, 网站如何对yahoo.com的消息进行验证呢?
  • Bob使用bob.yahoo.com再访问另外一个网站b.com 会发生什么状况?
  • 和CAS有什么相同和不同之处?
  • 和第三方登录有什么区别? (使用QQ、微博、微信)


评论