SAML2.0入門指南

SAML,全稱為Security Assertion Markup Language脱吱,是一種用于安全性斷言的標(biāo)記預(yù)壓帚呼,目前的最新版本是2.0。原文地址
本系列相關(guān)文章:
OAuth2.0 協(xié)議入門指南
OpenID Connect 協(xié)議入門指南
OpenSAML示例

SAML在單點(diǎn)登錄中大有用處:在SAML協(xié)議中阐斜,一旦用戶身份被主網(wǎng)站(身份鑒別服務(wù)器衫冻,Identity Provider,IDP)認(rèn)證過(guò)后谒出,該用戶再去訪問(wèn)其他在主站注冊(cè)過(guò)的應(yīng)用(服務(wù)提供者隅俘,Service Providers,SP)時(shí)到推,都可以直接登錄考赛,而不用再輸入身份和口令。

SAML本身是一個(gè)很復(fù)雜的協(xié)議莉测,這里只選取最重要的部分為大家講解颜骤,更多細(xì)節(jié)請(qǐng)見(jiàn)官方文檔,后續(xù)的文章也會(huì)進(jìn)一步解析捣卤。

SAML協(xié)議的核心是: IDP和SP通過(guò)用戶的瀏覽器的重定向訪問(wèn)來(lái)實(shí)現(xiàn)交換數(shù)據(jù)忍抽。

SP向IDP發(fā)出SAML身份認(rèn)證請(qǐng)求消息,來(lái)請(qǐng)求IDP鑒別用戶身份董朝;IDP向用戶索要用戶名和口令鸠项,并驗(yàn)證其是否正確,如果驗(yàn)證無(wú)誤子姜,則向SP返回SAML身份認(rèn)證應(yīng)答祟绊,表示該用戶已經(jīng)登錄成功了,此外應(yīng)答中里還包括一些額外的信息哥捕,來(lái)卻確保應(yīng)答被篡改和偽造牧抽。

下面我們以用戶登錄SP,SP向IDP發(fā)起請(qǐng)求來(lái)確認(rèn)用戶身份為例子遥赚,看看SAML的工作流程扬舒。比如SP是Google的Apps,IDP是一所大學(xué)的身份服務(wù)器凫佛,Alice是該大學(xué)的一名學(xué)生讲坎。

image.png

現(xiàn)在Alice要通過(guò)瀏覽器查閱她的郵件孕惜,Alice一般會(huì)通過(guò)瀏覽器訪問(wèn)一個(gè)網(wǎng)頁(yè),比如https://mail.google.com/a/my-university.nl (step1)晨炕。因?yàn)檫@是個(gè)聯(lián)合身份域衫画,所以Google不會(huì)向用戶索要用戶名和密碼,而是將其從定向到IDP來(lái)認(rèn)證其身份(step3)府瞄。用戶被重定向的URL類似于這種:

https://idp.uni.nl/sso?
SAMLRequest=fVLLTuswEN0j8Q…c%3D

嵌入到HTTP請(qǐng)求中的SAMLRequest就是SAML認(rèn)證請(qǐng)求消息碧磅。因?yàn)镾AML是基于XML的(通常比較長(zhǎng)),完整認(rèn)證請(qǐng)求消息要經(jīng)過(guò)壓縮(為Url節(jié)省空間)和編碼(防止特殊字符)才能傳輸遵馆。在壓縮和編碼之前鲸郊,SAML消息有如下格式:

<AuthnRequest  ID="kfcn...lfki" 
  Version="2.0" 
  IssueInstant="2013-02-05T08:28:50Z" 
  ProtocolBinding="urn:oasis:names:tc:SAML: 2.0:bindings:HTTP-POST" 
  ProviderName="google.com" 
  AssertionConsumerServiceURL="https://www.google.com/a/uni.nl/acs">
  <Issuer>google.com</Issuer>
  <NameIDPolicy  AllowCreate="true"
    Format="urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified"/>;
</AuthnRequest>;

上面的內(nèi)容用最直白的方式解釋出來(lái)就是:這個(gè)來(lái)自Google的請(qǐng)求,請(qǐng)驗(yàn)證當(dāng)前用戶的身份货邓,并將結(jié)果返回秆撮。

當(dāng)IDP收到消息并確認(rèn)要接受認(rèn)證請(qǐng)求之后,就會(huì)要求Alice輸入用戶名和口令來(lái)驗(yàn)證其身份(如果Alice已經(jīng)登錄過(guò)了换况,就會(huì)跳過(guò)該步驟)职辨;當(dāng)驗(yàn)證通過(guò)之后,Alice的瀏覽器將會(huì)跳轉(zhuǎn)回Google的特定頁(yè)面(AssertionConsumerService戈二,簡(jiǎn)稱ACS舒裤,step6)。同樣觉吭,SAML身份認(rèn)證響應(yīng)的內(nèi)容也是在壓縮并編碼后以參數(shù)的形式傳輸腾供。在壓縮和編碼之前茫舶,其結(jié)構(gòu)類如下:

<Response Version="2.0" 
  IssueInstant="2013-02-05T08:29:00Z" 
  Destination="https://www.google.com/a/my.uni.nl/acs" InResponseTo="kfcn...lfki">   
  <Issuer>https://idp.uni.nl/</Issuer>   
  <Status>
    <StatusCode   
      Value="urn:oasis:names:tc:SAML:2.0:status:Success"/> 
  </Status> 
  <Assertion Version="2.0" 
    IssueInstant="2013-02-05T08:29:00Z">     
    <Issuer>https://idp.uni.nl/</Issuer>   
    <Subject> 
      <NameID>alice</NameID>   
      <SubjectConfirmation ...> 
        <SubjectConfirmationData 
          NotOnOrAfter="2013-02-05T08:34:00Z"   
          Recipient="https://www.google.com/a/my.uni.nl/acs" InResponseTo="kfcn...lfki"/>  
        </SubjectConfirmation> 
    </Subject> 
    <Conditions NotBefore="2013-02-05T08:28:30Z" NotOnOrAfter="2013-02-05T08:34:00Z"> 
    </Conditions> 
    <AuthnStatement 
      AuthnInstant="2013-02-05T08:29:00Z" 
      SessionNotOnOrAfter="2013-02-05T16:29:00Z> 
    </AuthnStatement> 
  </Assertion>
 </Response>

雖然內(nèi)容很多闷愤,但是其主要表達(dá)的是:該消息來(lái)自idp.uni.nl富拗,名為Alice用戶的身份已經(jīng)被我驗(yàn)證倒得,該消息的有效期為2分鐘。此外栈暇,重定向的URL中還要有該消息的簽名以保證其不備篡改唉俗,驗(yàn)證簽名的公鑰和算法陌凳,都是IDP和SP提前協(xié)商好的嗓蘑。

當(dāng)Google接受到SAML認(rèn)證響應(yīng)之后须肆,會(huì)首先驗(yàn)證消息的簽名是否正確(step7)以及是否因超時(shí)而失效。然后再?gòu)恼J(rèn)證消息中提取出Google能識(shí)別用戶身份(NameID桩皿,即Alice)豌汇,如果以上的步驟都是順利的,用戶將會(huì)成功登陸Google(Step8)业簿。

為了便于解釋瘤礁,以上例子中的信息都保持了可讀性阳懂,如果想要去看看真實(shí)的SAML信息梅尤,建議推薦使用火狐瀏覽器的插件工具 SAML tracer柜思。該插件將會(huì)在瀏覽器中添加一個(gè)窗口來(lái)顯示SAML消息,以下是截圖:

SAML tracer

希望以上的內(nèi)容能幫助你理解SAML協(xié)議巷燥。SAML協(xié)議的內(nèi)容十分復(fù)雜赡盘,但是涉及到單點(diǎn)登錄的內(nèi)容都是以上述內(nèi)容為基礎(chǔ)的。

更多關(guān)于SAML協(xié)議的是實(shí)現(xiàn)的內(nèi)容缰揪,請(qǐng)參見(jiàn)本人編寫的一系列教程文章來(lái)介紹如何使用OpenSAML陨享,歡迎閱讀指正:

  1. OpenSAML 使用引導(dǎo) I : 簡(jiǎn)介
  2. OpenSAML 使用引導(dǎo) II : Service Provider 的實(shí)現(xiàn)之AuthnRequest
  3. OpenSAML 使用引導(dǎo) III: Service Provider 的實(shí)現(xiàn)之Artifact與斷言
  4. OpenSAMl 使用引導(dǎo)IV: 安全特性

擴(kuò)展閱讀

  1. OAuth2.0 協(xié)議入門指南
  2. OpenID Connect 協(xié)議入門指南
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市钝腺,隨后出現(xiàn)的幾起案子抛姑,更是在濱河造成了極大的恐慌,老刑警劉巖艳狐,帶你破解...
    沈念sama閱讀 218,640評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件定硝,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡毫目,警方通過(guò)查閱死者的電腦和手機(jī)蔬啡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,254評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)镀虐,“玉大人箱蟆,你說(shuō)我怎么就攤上這事」伪悖” “怎么了空猜?”我有些...
    開(kāi)封第一講書人閱讀 165,011評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)诺核。 經(jīng)常有香客問(wèn)我抄肖,道長(zhǎng),這世上最難降的妖魔是什么窖杀? 我笑而不...
    開(kāi)封第一講書人閱讀 58,755評(píng)論 1 294
  • 正文 為了忘掉前任漓摩,我火速辦了婚禮,結(jié)果婚禮上入客,老公的妹妹穿的比我還像新娘管毙。我一直安慰自己,他們只是感情好桌硫,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,774評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布夭咬。 她就那樣靜靜地躺著,像睡著了一般铆隘。 火紅的嫁衣襯著肌膚如雪卓舵。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 51,610評(píng)論 1 305
  • 那天膀钠,我揣著相機(jī)與錄音掏湾,去河邊找鬼裹虫。 笑死,一個(gè)胖子當(dāng)著我的面吹牛融击,可吹牛的內(nèi)容都是我干的筑公。 我是一名探鬼主播,決...
    沈念sama閱讀 40,352評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼尊浪,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼匣屡!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起拇涤,我...
    開(kāi)封第一講書人閱讀 39,257評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤捣作,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后鹅士,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體虾宇,經(jīng)...
    沈念sama閱讀 45,717評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,894評(píng)論 3 336
  • 正文 我和宋清朗相戀三年如绸,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了嘱朽。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,021評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡怔接,死狀恐怖搪泳,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情扼脐,我是刑警寧澤岸军,帶...
    沈念sama閱讀 35,735評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站瓦侮,受9級(jí)特大地震影響艰赞,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜肚吏,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,354評(píng)論 3 330
  • 文/蒙蒙 一方妖、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧罚攀,春花似錦党觅、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,936評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至炫掐,卻和暖如春魁莉,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,054評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工旗唁, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留宙地,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,224評(píng)論 3 371
  • 正文 我出身青樓逆皮,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親参袱。 傳聞我的和親對(duì)象是個(gè)殘疾皇子电谣,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,974評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容