David.Turing's blog

           

          剖析CAS Proxy的設計原理

          由于CAS在開源社區的影響力,它逐漸被應用到各種復雜的SSO環境中。CAS的基本原理在廣州UserGroup上有很多文章介紹,我不再做原理性的探討,但CAS Proxy稍微復雜,值得對其作一個剖析,以便在日后的配置中減少配置上的失誤。
          1,CAS Proxy的目的
          CAS Proxy的目的是,當瀏覽器用戶Peter訪問應用A,應用A引用了應用B1, B2的授權性資源(Authorized Resource),應用A想代表Peter去訪問應用B1, B2,因此應用A需要告訴應用B1, B2當前用戶是誰,以便B1,B2對Peter的Request進行授權。這就是CAS代理(Proxy)。

          這種情況很可能出Portal中,比如我在一個Web應用中要求同時從mail.163.com(應用B1),mail.126.com(應用B2)收取郵件并Load入到現在的應用A中去。這種場景中,應用A不可能分別Redirect用戶Peter到163.com或者126.com去(因為用戶是想要A展示B1,B2的內容,他并不是要訪問163,126),只不過B1,B2需要認證才能訪問,因此,A承擔著這樣一個角色,代表用戶peter去load B1,B2的郵件。

          2,CAS Proxy的執行場景
          CAS?Proxy協議很準確的描述了這種場景,簡單起見,將場景分為兩Part:

          PartA[獲取PGT]:

          什么是PGT,PGT就是不需要S,T就能獲取到NetID的票據,如果你對票據(Ticket),服務票據
          等概念不理解,建議請閱讀<Weblogic Security In Action>中篇的Kerberos協議部分。

          簡單的說,票據(Ticket)就是一張門票,你來看周杰倫的演唱會,你需要門票,那門票叫做
          Ticket,本文中的T,周杰倫演唱會就是S(Service)。
          你憑什么拿到T,當然不是因為你懂Java,而是因為你是周杰倫的VIP Fans,VIP Fans有VIP卡(即文中的C, Credential,中文翻譯叫做憑證),他憑這個C可以拿到票(T),注意,是S Service(周杰倫演唱會)而不是Z Service(李宇春演唱會)或者Y Service (張靚穎演唱會)! 這個T比較巧妙,類似地鐵票,CAS將它設計成一次性的票據,周杰倫拿著它給CAS Server一驗證,便知道你是誰了(NetID),恩,原來是VIP Fans,歡迎歡迎........
          這本來就是CAS基本模式了,本模式還附屬了一個PGTURL和PGT(PGTIOU僅僅用于關聯作用,忽略),搞清楚PGT和PGTURL,是成功配置CAS Proxy的關鍵。
          PGT的概念(我不敢打比喻了)是,它被應用A用來代理瀏覽器用戶Peter去訪問其他更多的應用的憑據。沒錯,它是一個憑據,你知道,CAS/Kerberos的世界,做任何事情都需要憑據(Ticket)。所以,如果A要做這個代理訪問動作,它依賴于PGT,PGT的用法見PartB,這里你知需要明白,PGT是給A用來向B1, B2兩個應用證實用戶Peter的身份,至于B1,B2怎么做,那還要看Peter的NetID是否具有取B1, B2郵件的權限。

          cas_proxy_1.gif


          PartB[獲取PGT]:

          PartB展示了PGT的作用,應用A(下圖中的Web application)向CAS Server提交S和PGT,S乃自己的應用標識,PGT最終讓A獲得PT,PT跟ST的作用一模一樣,它也是一次性的票據,A傳PT給后端的B1(下圖中的Back-end application),B1就可以根據這個PT獲得A現在代理的用戶Peter的NetID了,如下圖所示。
          cas_proxy_2.gif


          最后,我們比較一下PartA和PartB
          PartA,A因為ST獲得Peter的NetID
          PartB,B1因為PT獲得Peter的NetID

          誰告訴B1 Peter的NetID, A!Proxy的由來就是這樣,A就是CAS Proxy!!

          有人問,干嘛這么麻煩,既然PartA中,A已經知道Perter的NetID,為何不直接告訴B1關于Peter的NetID?
          理由很簡單,SSO依賴于域的一種信任關系,也就是,
          1)瀏覽器用戶是不可信的,如果可信,那么認證要來干什么?
          2)CAS Server是可信的,如果CAS Server不可信,認證會有結果嗎?
          3)Web應用可信嗎?如果你認為可信,那么你就會問上面那個問題,呵呵。

          事實上,在CAS實際環境中,CAS僅僅依賴于信任證書的部署和雙向SSL來實現信任關系的建立和核實。應用A和應用B是完全不同的兩個應用,他們之間并沒有建立信任關系,因此如果A告訴B1, B2關于Peter的NetID, B1,B2也不會相信,B1,B2只信任CAS Server(CAS環境唯一可以信賴的東西,這就是單點登錄的前置條件——單點信任),最終,問題仍然需要A向通過CAS Server向B提交一個Peter身世(NetID)的說法。

          3, Proxy配置

          CAS Client端:
          配置Web應用的web.xml使用casclient.jar的兩個servlet:

          ?? < servlet >
          ????
          < servlet-name > ProxyTicketReceptor </ servlet-name >
          ????
          < servlet-class > edu.yale.its.tp.cas.proxy.ProxyTicketReceptor </ servlet-class >
          ??
          </ servlet >

          ??
          < servlet-mapping >
          ????
          < servlet-name > ProxyTicketReceptor </ servlet-name >
          ????
          < url-pattern > /CasProxyServlet </ url-pattern >
          ??
          </ servlet-mapping >

          ???
          另外,在CAS Server端,確保CAS-Server的兩個關于Proxy的Servlet能夠正常被加載(默認配置即可)。

          ???? <!-- ?Proxy?(PGT?acquisition)? -->
          ????
          < servlet >
          ??????
          < servlet-name > Proxy </ servlet-name >
          ??????
          < servlet-class > edu.yale.its.tp.cas.servlet.Proxy </ servlet-class >
          ????
          </ servlet >

          ????
          <!-- ?Modern?proxy-service?validation? -->
          ????
          < servlet >
          ??????
          < servlet-name > ProxyValidate </ servlet-name >
          ??????
          < servlet-class > edu.yale.its.tp.cas.servlet.ProxyValidate </ servlet-class >
          ????
          </ servlet >

          最后一步,先Look一下如何單步調試CAS Proxy的過程,然后就可以自己編寫一個簡單的應用A和應用B1,B2來測試CAS Proxy了。

          posted on 2006-04-26 23:54 david.turing 閱讀(14478) 評論(0)  編輯  收藏 所屬分類: Security領域

          導航

          統計

          常用鏈接

          留言簿(110)

          我參與的團隊

          隨筆分類(126)

          隨筆檔案(155)

          文章分類(9)

          文章檔案(19)

          相冊

          搜索

          積分與排名

          最新隨筆

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 万全县| 尚志市| 慈溪市| 宁陵县| 桐庐县| 合阳县| 仙游县| 称多县| 平邑县| 澄江县| 巴彦县| 新干县| 台前县| 南部县| 通海县| 延安市| 晋宁县| 九寨沟县| 崇礼县| 保亭| 西安市| 彰化市| 潞城市| 顺平县| 海原县| 南川市| 临颍县| 梅河口市| 英超| 五华县| 诏安县| 湟中县| 中方县| 鄂伦春自治旗| 确山县| 旬邑县| 扬州市| 高要市| 临潭县| 阿拉善盟| 来宾市|