单点登录解决方案的架构与实现

Post on 10-May-2015

3.771 views 6 download

Transcript of 单点登录解决方案的架构与实现

@宝玉xp

2011.4

单点登录解决方案的架构与实现

单点登录 什么是单点登录?

CLIENT -> WEB [GTALK -> GMAIL]

CLIENT -> WEB [MSN->HOTMAIL]

WEB -> WEB [GOOGLE READER -> GMAIL]

单点登录定义 •  单点登录SSO(Single Sign-On)是身份管理中的一部分。SSO的一种较为通俗的定义是:SSO是指访问同一服务器不同应用中的受保护资源的同一用户,只需要登录一次,即 通过一个应用中的安全验证后,再访问其他应用中的受保护资源时,不再需要重新登录验证。

客户端登录过程 以msn为例分析

LIVE MESSENGER登录过程 https://login.live.com/ppsecure/sha1auth.srf?lc=1033

https://mail.live.com/rru=inbox&wlexpid=80097F54CF93..........

LIVE MESSENGER 登录HOTMAIL传输的数据 •  POST https://login.live.com/ppsecure/sha1auth.srf?lc=1033

•  token=ct%3D1302192303%26bver%3D7%26wa%3Dwsignin1.0%26ru%3Dhttp://mail.live.com/%253Frru%253Dinbox%2526wlexpid%253D80097F54CF934247916123482695F310%2526wlrefapp%253D2%26pl%3DMBI%26appid%3D%257B7108E71A-9926-4FCB-BCC9-9A9D3F32E423%257D%26da%3D%253CEncryptedData%2520xmlns%253D%2522http://www.w3.org/2001/04/xmlenc%2523%2522%2520Id%253D%2522BinaryDAToken0%2522%2520Type%253D%2522http://www.w3.org/2001/04/xmlenc%2523Element%2522%253E%253CEncryptionMethod%2520Algorithm%253D%2522http://www.w3.org/2001/04/xmlenc%2523tripledes-cbc%2522%253E%253C/EncryptionMethod%253E%253Cds:KeyInfo%2520xmlns:ds%253D%2522http://www.w3.org/2000/09/xmldsig%2523%2522%253E%253Cds:KeyName%253Ehttp://Passport.NET/STS%253C/ds:KeyName%253E%253C/ds:KeyInfo%253E%253CCipherData%253E%253CCipherValue%253EAdn%252BcqR1gmiTLVQGs8qXIcBFJ0QPGi7O%252BRbRjyoR0F2Iz94dGP8s9qoe3GdGFUt9/qguaX1ygP/ghA%252B7m6eyYgUjKr6ZLQXL3lvi/2%252BAiYeEdRp3dTFqifsjTdc6a0el3rxnayb5yHiP3YbSzknVcqayqszMLnZIIuUxrDVcHGuobAIqCHrWIwiApfYJCjbbnzXNr4GIqbueQkebpn7JU16bkCion1neNxSg58P7XLEqxzAce3ZUNZWoUDnT/6OtDCkuCmxewrn3sr5Ugh/FSoW%252B3KGledTk3brKOu8Uu7YNM5Y2k4K90Su8U3zXCyhJXkrVJCzRhJCvOCuWUs4DTEs9ocxKUSOICqaicIc6tTJYfyLlWHhOmsigGzVj2B8NOysbsr/V6KnLu2vgEWkYr0j/ZYYrAa1R0AuIep0i0hPHUTeOz7HAV5PzwciNA33YIgzyGn3ivmFFcjkxRwmesidmtXopLUSj%252BYIqUqXQ2p11vmQv9UJYCzWghtNS%253C/CipherValue%253E%253C/CipherData%253E%253C/EncryptedData%253E%26nonce%3DgGOWyChz45t49%252BfhhBsK5lPq/swIKn%252BZ%26hash%3DXvO2NYVpeXsR8cCa7TEv4JLzEVw%253D

TOKEN 数据 •  ct=1302192303

•  bver=7

•  wa=wsignin1.0

•  ru=http://mail.live.com/%3Frru%3Dinbox%26wlexpid%3D80097F54CF934247916123482695F310%26wlrefapp%3D2

•  pl=MBI

•  appid=%7B7108E71A-9926-4FCB-BCC9-9A9D3F32E423%7D

•  da=%3CEncryptedData%20xmlns%3D%22http://www.w3.org/2001/04/xmlenc%23%22%20Id%3D%22BinaryDAToken0%22%20Type%3D%22http://www.w3.org/2001/04/xmlenc%23Element%22%3E%3CEncryptionMethod%20Algorithm%3D%22http://www.w3.org/2001/04/xmlenc%23tripledes-cbc%22%3E%3C/EncryptionMethod%3E%3Cds:KeyInfo%20xmlns:ds%3D%22http://www.w3.org/2000/09/xmldsig%23%22%3E%3Cds:KeyName%3Ehttp://Passport.NET/STS%3C/ds:KeyName%3E%3C/ds:KeyInfo%3E%3CCipherData%3E%3CCipherValue%3EAdn%2BcqR1gmiTLVQGs8qXIcBFJ0QPGi7O%2BRbRjyoR0F2Iz94dGP8s9qoe3GdGFUt9/qguaX1ygP/ghA%2B7m6eyYgUjKr6ZLQXL3lvi/2%2BAiYeEdRp3dTFqifsjTdc6a0el3rxnayb5yHiP3YbSzknVcqayqszMLnZIIuUxrDVcHGuobAIqCHrWIwiApfYJCjbbnzXNr4GIqbueQkebpn7JU16bkCion1neNxSg58P7XLEqxzAce3ZUNZWoUDnT/6OtDCkuCmxewrn3sr5Ugh/FSoW%2B3KGledTk3brKOu8Uu7YNM5Y2k4K90Su8U3zXCyhJXkrVJCzRhJCvOCuWUs4DTEs9ocxKUSOICqaicIc6tTJYfyLlWHhOmsigGzVj2B8NOysbsr/V6KnLu2vgEWkYr0j/ZYYrAa1R0AuIep0i0hPHUTeOz7HAV5PzwciNA33YIgzyGn3ivmFFcjkxRwmesidmtXopLUSj%2BYIqUqXQ2p11vmQv9UJYCzWghtNS%3C/CipherValue%3E%3C/CipherData%3E%3C/EncryptedData%3E

•  nonce=gGOWyChz45t49%2BfhhBsK5lPq/swIKn%2BZ

•  hash=XvO2NYVpeXsR8cCa7TEv4JLzEVw%3D

DA •  <EncryptedData xmlns="http://www.w3.org/2001/04/xmlenc#" Id="BinaryDAToken0" Type="http://

www.w3.org/2001/04/xmlenc#Element"> •    <EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#tripledes-cbc" /> •  <ds:KeyInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#"> •    <ds:KeyName>http://Passport.NET/STS</ds:KeyName> •    </ds:KeyInfo> •  <CipherData> •    <CipherValue>Adn+cqR1gmiTLVQGs8qXIcBFJ0QPGi7O+RbRjyoR0F2Iz94dGP8s9qoe3GdGFUt9/

qguaX1ygP/ghA+7m6eyYgUjKr6ZLQXL3lvi/2+AiYeEdRp3dTFqifsjTdc6a0el3rxnayb5yHiP3YbSzknVcqayqszMLnZIIuUxrDVcHGuobAIqCHrWIwiApfYJCjbbnzXNr4GIqbueQkebpn7JU16bkCion1neNxSg58P7XLEqxzAce3ZUNZWoUDnT/6OtDCkuCmxewrn3sr5Ugh/FSoW+3KGledTk3brKOu8Uu7YNM5Y2k4K90Su8U3zXCyhJXkrVJCzRhJCvOCuWUs4DTEs9ocxKUSOICqaicIc6tTJYfyLlWHhOmsigGzVj2B8NOysbsr/V6KnLu2vgEWkYr0j/ZYYrAa1R0AuIep0i0hPHUTeOz7HAV5PzwciNA33YIgzyGn3ivmFFcjkxRwmesidmtXopLUSj+YIqUqXQ2p11vmQv9UJYCzWghtNS</CipherValue>

•    </CipherData> •  </EncryptedData>

GTALK打开登录GMAIL传输的数据 •  GET https://www.google.com/accounts/TokenAuth

•  auth=APh-3FxTAOVo71-77U8NQqkkMpJfIzHHi3ClRqCJzSRrft5CWIGKk6Fu5EwlCxmS0sloWRId1x18wCRrhrpA2hwNYyijP4AAu6YwENEFnzYY2nc8jOxmkkEJ0N8qRh9Xze3kr-_GiVVzBxzHOHxK0ZH2vge5JJyM0IEiTH69Hx8XYZ86qYi_-rEKQMlYdLuGE4PJM5pULCi_895SjX2CNU9jyv-6fTSS72nTOzrBDJ0kV9tW05gxNtdBQSvfldctE8GSpiDEds0B8oTuZAbgpnp17SO_MzEKGJ7_kGbAU66ea_Rn2_MVitDjrqIp8rvN_GWrRWfLtOPgFVBmlFqPrrtAKWQbAz9HhyVqv4NptuY0LH_BkI4Db82Ws3I3g-k3JGrRIG3wiw5yyt8t7zw0-OGU4yJkr1citxw4h30cIRybVTmX3WIaW1c_J-fUpwmwFcVCQ47V09w-bdf3jgSH6TY_czbKn-ziqrqE6tbeACdw3BNLKRJ8y7-01Tbu4EOOYufKxiG--Z1ONFXG8uh8pkldJDQQ1XLX3RvgS3kOJsKk-Rk-0TtMtW-crBelq83XM3x2NMTUWguRWkkrdPP18V7x97Ez_UeMaETUP2cWau0xzhKo9yL1Lws,

•  service=mail

•  continue=https%3A%2F%2Fmail.google.com%2Fmail

•  source=googletalk

关键数据 •  登录网站地址(Login Portal Url)

•  https://login.live.com/ppsecure/sha1auth.srf?lc=1033

•  https://www.google.com/accounts/TokenAuth

•  返回地址(Return Url)

•  ru=http://mail.live.com/%3Frru%3Dinbox%26wlexpid%3D80097F54CF934247916123482695F310%26wlrefapp%3D2

•  continue=https%3A%2F%2Fmail.google.com%2Fmail

•  应用Id(App Id)

•  appid=%7B7108E71A-9926-4FCB-BCC9-9A9D3F32E423%7D

•  source=googletalk

•  授权凭证(Credential)

数据如何保护? 如何来保护授权凭证中的信息

数据加密 •  可逆加密 or 不可逆加密?

•  可逆加密算法

•  DES, Triple-DES, AES, …

•  公共密钥 or 各应用独立密钥?

•  密钥

•  每个应用系统拥有一个唯一的AppId和一个与其对应的Credential密钥。

•  不同的应用系统使用不同的Credential密钥,目的是防止截取或伪造单点登录系统的Credential,并防止两个SSO应用系统之间互相截取或伪造对方的Credential。

密钥管理 如何管理SSO应用的密钥?

密钥管理 •  SSO Key Server 统一登记和管理

•  根据AppId区分应用系统

•  SSO应用系统向SSO Service获取属于自己的密钥

•  密钥有一定时效性,会过期

授权凭证信息 授权凭证里面都有什么?

授权凭证(CREDENTIAL) •  SSO应用系统登录时,SSO Portal会验证用户身份,并向应用返回一个代表用户身份的Credential

•  Credential一般以BASE64字符串的形式存在

•  Credential中包含的加密信息, SSO应用系统均拥有Credential密钥,可解开该Credential以获取用户的身份信息。

•  Credential具有一定的有效期。

•  Credential包含的信息包括:

•  加密信息:用户ID、用户名、Credential生成时间、Credential失效时间

•  未加密信息:对应密钥编号、AppId

授权凭证的结构 •  Credential一般采用明文结构内含密文结构的形式。

•  明文部分

•  对应密钥编号 为保证在密钥更换期间,旧密钥加密的Credential能被正常解密,所以我们需要在Credential中标记出Credential对应的密钥号码

•  AppId,对应App

•  密文部分

•  保存加密后的用户信息,客户端不可读。

•  服务器端解密后可从密文中获取用户的身份标识。

授权凭证

属性名 说明 KeyId 凭证生成时使用的密钥的标识,服务器端与客户端均

可读,但对客户端透明。 例如: 0:0号密钥 1:1号密钥 2:2号密钥  

AppId 每个SSO应用系统申请的编号,唯一代表一个SSO应用系统。

EncryptedData 加密后的用户信息,客户端不可读。服务器端解密后可从明文中获取用户的身份标识。

ENCRYPTEDDATA解密

属性名 说明

Nonce 随机整数

CreateTime 凭证生成时间

ExpireTime 凭证过期时间

UserId 用户Id

UserIp 用户登录IP

Username/Email 用户名或Email

Hash SHA1计算的散列值,防止数据被修改

授权凭证的验证和解析 如何验证一个授权凭证是否合法?取出里面的信息?

两种授权凭证验证解析方案对比

从SSO服务器验证 应用自行验证

Credential

App Server

SSO Key Server

Credential

App Server

SSO Server

授权凭证的验证流程

校验AppId 根据密钥编号对应密钥解密数据

校验Hash值

校验IP 校验授权凭证是否到期 更新授权凭证

客户端单点登录 客户端单点登录流程?

客户端 SSO Portal

1. 提交账号密码登录

2. 返回客户端授权凭证

3. 保持登录[带上旧凭证]

4. 返回客户端新的授权凭证

客户端 浏览器 应用站点1 SSO Portal

5. 点击站点链接 6. 访问页面[使用客户端凭证]

7. 302跳转[带上返回地址]

8. 请求SSO网页[带上返回地址]

9. 302跳转[设置SSO Portal Cookie,Url中带上Site 1凭证]

10. 访问页面[Url带凭证]

11. 200 OK[设置凭证到Cookie]

不同站点间的单点登录 多个站点之间如何共享登录?

用户 浏览器 应用站点1 SSO站点

1. 浏览网站1 2. 访问页面

3. 302跳转[带上返回地址]

4. 请求登录网页[带上返回地址]

5. 200 OK[登录表单] 6. 输入账号密码

7. 提交表单[带上返回地址]

8. 302跳转[设置Cookie,Url中带上凭证]

9. 访问页面[Url带凭证]

10. 200 OK[设置凭证到Cookie]

11. 访问页面[Cookie带凭证]

12. 200 OK

用户 浏览器 应用站点2 SSO站点

13. 浏览网站2 14. 访问页面

15. 302跳转[带上返回地址]

16. 请求登录网页[带上返回地址]

17. 302跳转[设置Cookie,Url中带上凭证]

18. 访问页面[Url带凭证]

19. 200 OK[设置凭证到Cookie]

20. 访问页面[Cookie带凭证]

21. 200 OK

系统架构 整体架构如何?

SSO Portal SSO Key Server

Site 1 Site 2 Site n App 1 App n

Q & A 提问时间

THANKS 谢谢