SAML2.0入門指南

SAML,全稱為Security Assertion Markup Language,是一種用于安全性斷言的標記預壓,目前的最新版本是2.0。原文地址
本系列相關文章:
OAuth2.0 協議入門指南
OpenID Connect 協議入門指南
OpenSAML示例

SAML在單點登錄中大有用處:在SAML協議中,一旦用戶身份被主網站(身份鑒別服務器,Identity Provider,IDP)認證過后,該用戶再去訪問其他在主站注冊過的應用(服務提供者,Service Providers,SP)時,都可以直接登錄,而不用再輸入身份和口令。

SAML本身是一個很復雜的協議,這里只選取最重要的部分為大家講解,更多細節請見官方文檔,后續的文章也會進一步解析。

SAML協議的核心是: IDP和SP通過用戶的瀏覽器的重定向訪問來實現交換數據。

SP向IDP發出SAML身份認證請求消息,來請求IDP鑒別用戶身份;IDP向用戶索要用戶名和口令,并驗證其是否正確,如果驗證無誤,則向SP返回SAML身份認證應答,表示該用戶已經登錄成功了,此外應答中里還包括一些額外的信息,來卻確保應答被篡改和偽造。

下面我們以用戶登錄SP,SP向IDP發起請求來確認用戶身份為例子,看看SAML的工作流程。比如SP是Google的Apps,IDP是一所大學的身份服務器,Alice是該大學的一名學生。

image.png

現在Alice要通過瀏覽器查閱她的郵件,Alice一般會通過瀏覽器訪問一個網頁,比如https://mail.google.com/a/my-university.nl (step1)。因為這是個聯合身份域,所以Google不會向用戶索要用戶名和密碼,而是將其從定向到IDP來認證其身份(step3)。用戶被重定向的URL類似于這種:

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

嵌入到HTTP請求中的SAMLRequest就是SAML認證請求消息。因為SAML是基于XML的(通常比較長),完整認證請求消息要經過壓縮(為Url節省空間)和編碼(防止特殊字符)才能傳輸。在壓縮和編碼之前,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>;

上面的內容用最直白的方式解釋出來就是:這個來自Google的請求,請驗證當前用戶的身份,并將結果返回。

當IDP收到消息并確認要接受認證請求之后,就會要求Alice輸入用戶名和口令來驗證其身份(如果Alice已經登錄過了,就會跳過該步驟);當驗證通過之后,Alice的瀏覽器將會跳轉回Google的特定頁面(AssertionConsumerService,簡稱ACS,step6)。同樣,SAML身份認證響應的內容也是在壓縮并編碼后以參數的形式傳輸。在壓縮和編碼之前,其結構類如下:

<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>

雖然內容很多,但是其主要表達的是:該消息來自idp.uni.nl,名為Alice用戶的身份已經被我驗證,該消息的有效期為2分鐘。此外,重定向的URL中還要有該消息的簽名以保證其不備篡改,驗證簽名的公鑰和算法,都是IDP和SP提前協商好的。

當Google接受到SAML認證響應之后,會首先驗證消息的簽名是否正確(step7)以及是否因超時而失效。然后再從認證消息中提取出Google能識別用戶身份(NameID,即Alice),如果以上的步驟都是順利的,用戶將會成功登陸Google(Step8)。

為了便于解釋,以上例子中的信息都保持了可讀性,如果想要去看看真實的SAML信息,建議推薦使用火狐瀏覽器的插件工具 SAML tracer。該插件將會在瀏覽器中添加一個窗口來顯示SAML消息,以下是截圖:

SAML tracer

希望以上的內容能幫助你理解SAML協議。SAML協議的內容十分復雜,但是涉及到單點登錄的內容都是以上述內容為基礎的。

更多關于SAML協議的是實現的內容,請參見本人編寫的一系列教程文章來介紹如何使用OpenSAML,歡迎閱讀指正:

  1. OpenSAML 使用引導 I : 簡介
  2. OpenSAML 使用引導 II : Service Provider 的實現之AuthnRequest
  3. OpenSAML 使用引導 III: Service Provider 的實現之Artifact與斷言
  4. OpenSAMl 使用引導IV: 安全特性

擴展閱讀

  1. OAuth2.0 協議入門指南
  2. OpenID Connect 協議入門指南
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,321評論 6 543
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,559評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,442評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,835評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,581評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,922評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,931評論 3 447
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,096評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,639評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,374評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,591評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,104評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,789評論 3 349
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,196評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,524評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,322評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,554評論 2 379

推薦閱讀更多精彩內容