网站 A 的页面 P1.aspx 要求登录后才能使用;网站 B 的页面 P2.aspx 也要求登录后才能使用;
现设置自己的验证中心C(类似微软的Passport),C有A、B的所有用户帐号,登录页面为 Login.aspx。
为简化问题讨论,首先忽略安全问题。
1 用户首先访问A:
1.1 访问 http://A/P1.aspx, P1.aspx检查是否有HasLogin的Cookie,如果没有,则重新定向到:
http://C/Login.aspx?Redir=http://A/P1.aspx (Redir参数为登录成功后的返回页面)
1.2 用户在C显示的登录对话框登录成功后,C设置Cookie HasLogin=True,这样用户就拥有C的已登录Cookie,同时重定向到:
http://A/SetCookie.aspx?HasLogin=True&Redir=http://A/P1.aspx
1.3 HasLogin参数告诉A的SetCookie.aspx,设置Cookie HasLogin=True,这样用户就拥有A的已登录Cookie,同时重定向到目的页面:
http://A/P1.aspx
1.4 P1.aspx检查已有登录Cookie,不再重定向,可以开始使用。
2 用户再访问B:
2.1 访问 http://B/P2.aspx, P2.aspx检查是否有HasLogin的Cookie,如果没有,则重新定向到:
http://C/Login.aspx?Redir=http://B/P2.aspx (Redir参数为登录成功后的返回页面)
2.2 用户在C已拥有已登录Cookie,Login.aspx直接重定向到:
http://B/SetCookie.aspx?HasLogin=True&Redir=http://B/P2.aspx
2.3 HasLogin参数告诉B的SetCookie.aspx,设置Cookie HasLogin=True,这样用户就拥有B的已登录Cookie,同时重定到向目的页面:
http://B/P2.aspx
1.4 P2.aspx检查已有登录Cookie,不再重定向,可以开始使用。
这样用户在A登录后,在B就不再需要登录,反过来也一样;Logout的过程类似,也是都要先通过C。
安全考虑:
实际的实现中,C传给两个网站的SetCookie不会是简单的HasLogin=True,而是一个加密的“票据”Ticket=一长串值;值解密后是用户的Id等相关信息;A可以在C预留一个RSA公钥,这样C会用该公钥加密用户信息后再传给A,这个Ticket只有A用私钥才能解开。
还有就是要考虑会话超时的同步处理,需要涉及一个TimeWindow的概念,本文略。
几个相关问题:
1. 为什么C不能直接给A和B设置Cookie?
浏览器为了保证安全,设置Cookie时如果不是当前Domain会被直接忽略。
发表于 @ 2007年04月08日 18:21:00|评论(loading...)|编辑