Single Sign-On(SSO)單點登陸的具體實現方案

作者: 麥子|君子蘭  來源: 博客園  發布時間: 2010-10-14 07:19  閱讀: 3382 次  推薦: 0   原文鏈接   [收藏]  
摘要:我這里的實現方案是傳統的cookie方案。希望此文對需要的朋友有用,也希望不足之處大家能夠提出。

  我們都知道網易、搜狐等大型門戶都有“通行證”的概念,這個通行證系統就是今天討論的“單點登錄系統”。其主要特征是多個站點一個用戶中心,一點登陸后其他也自動登錄,注銷也是。比如我們在126登錄了郵箱,再去163.com就是登陸狀態。我這里的實現方案是傳統的cookie方案。希望此文對需要的朋友有用,也希望不足之處大家能夠提出。
  SSO的基本功能:
  統一登錄
  所有站點的登錄都要跳轉至SSO來登錄,同時附帶剛剛請求的url參數,以便登陸后返回。
  例如  http://sso.a.com/login?url=http://www.b.com ,登錄之后,我們Response一個cookie,并且將其domain設為 a.com頂級域,這樣只要是同域的站點都可以直接訪問到這個cookie。

  由于cookie不能跨域,所以這里要解決不同域下的cookie問題。解決辦法就是通過JS API來獲取a.com的cookie信息,并通過url傳遞個b.com。
  我們知道ajax是不能跨域訪問的,但是我們可以<script>一個跨域的JS(這就是JSAPI),所以SSO系統需要提供一個callback參數,輸出為一段js代碼。

  SSO輸出cookie給調用者,接受callback參數

 

 var user = Request.Cookies["Username"];
 var callback = Request.QueryString["callback"];
 if(user!=null)
        Response.Write(callback+"("+user.ToJson()+")");//ToJson是一個擴展方法,將對象序列化為Json格式

b.com獲取cookie的辦法

 

  $.getScript("http://sso.a.com/getcookie?callback=setuser");
        function setuser(data)
        {
            if(data!=null)
            {
                var user = eval(data);
                alert("hello"+user.Username);
            }
            setcookie(user);//將得到的cookie寫在本地
        }

通過這種辦法,我們的b.com便可以通過得到的cookie知道該用戶是否登錄。
  統一注銷
  每個站點注銷都必須連接到sso.a.com/logout來實現注銷,刪除cookie。

 

  驗證登錄
  為了實現同時注銷功能,比如bbs.a.com注銷了,www.b.com必須知道,所以b.com的所有需要知道登陸狀態的請求都必須訪問一次sso.a.com來驗證是否還在登錄。 
  驗證登錄可以有2種辦法:
  一種是上面提到的通過JSAPI知道cookie是否存在來判斷其他系統是否注銷
  另外一種是在本地已存cookie的情況下通過WebService由服務端去驗證該用戶是否還在登陸狀態。
  這兩種辦法各有優缺點,第一種是不需要知道本地是否有cookie的,第二種需要借助webService,但增加的檢驗的嚴謹性。
  假如我們在b.com做重要的數據操作,最好通過服務端檢驗來判定登陸狀態,如果從cookie來判斷,則必須保證cookie無法偽造,也就是得對cookie進行加密,解密。
  如果通過WebService客戶端的cookie同樣需要一個無法偽造的標識,比如GUID,但不需要加密,只需要與服務端的GUID和UserName進行匹配即可。但是明顯通過WebService的壓力要遠大于解密cookie。如果站點居多且訪問量很高,那這種驗證請求會對SSO造成巨大壓力。
  服務端設計
  如果SSO還有其他壓力大的工作,則需要多臺機器部署。多臺部署就會有一個Session問題,所以服務端的用戶登錄狀態不能把Session存于InProc中,也不能是StatusServer中,只能是SqlServer中。而我的解決辦法是放在分布式緩存(Memcached)中,當然其實已經不是Session了,而是普通的緩存列表。把Username和Guid放在Memcached中,做成hash表,能夠很快的找到某個用戶的登陸情況(Guid和請求的一致)
  授權白名單
  SSO會暴露一些WebService接口給站點使用,所以不能隨便被別人所利用,這時就需要驗證請求的ip是否為授權的地址)

0
0
 
標簽:單點登錄 SSO
 
 

文章列表

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()