SAML2.0 協議初識(一)


一、什么是 SAML 協議?

SAML 即安全斷言標記語言,英文全稱是 Security Assertion Markup Language。它是一個基於 XML 的標准,用於在不同的安全域(security domain)之間交換認證和授權數據。在 SAML 標准定義了身份提供者 (identity provider) 和服務提供者 (service provider),這兩者構成了前面所說的不同的安全域。 SAML 是 OASIS 組織安全服務技術委員會(Security Services Technical Committee) 的產品。

SAML(Security Assertion Markup Language)是一個 XML 框架,也就是一組協議,可以用來傳輸安全聲明。比如,兩台遠程機器之間要通訊,為了保證安全,我們可以采用加密等措施,也可以采用 SAML 來傳輸,傳輸的數據以 XML 形式,符合 SAML 規范,這樣我們就可以不要求兩台機器采用什么樣的系統,只要求能理解 SAML 規范即可,顯然比傳統的方式更好。SAML 規范是一組 Schema 定義。

可以這么說,在 Web Service 領域,schema 就是規范,在 Java 領域,API 就是規范。

二、SAML 協議的作用

  • 認證聲明:聲明用戶是否已經認證,通常用於單點登錄。
  • 屬性聲明:聲明某個 Subject 所具有的屬性。
  • 授權決策聲明:聲明某個資源的權限,即一個用戶在資源 R 上具有給定的 E 權限而能夠執行 A 操作。

三、SAML 相關定義

  • SP(Service Provider): 向用戶提供正式商業服務的實體,通常需要認證一個用戶的身份;

  • IDP(Identity Provider): 提供用戶的身份鑒別,確保用戶是其所聲明的身份

  • 斷言 (Assertions) 即信息:斷言是在 SAML 中用來描述認證的對象,其中包括一個用戶在什么時間、以什么方式被認證,同時還可以包括一些擴展信息,比如用戶的 Email 地址和電話等等。下面是一個斷言的例子:

 1 <?xml version="1.0"?>
 2 <saml:Assertion xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema" ID="_d71a3a8e9fcc45c9e9d248ef7049393fc8f04e5f75" Version="2.0" IssueInstant="2014-07-17T01:01:48Z">
 3   <saml:Issuer>http://idp.example.com/metadata.php</saml:Issuer>
 4   <saml:Subject>
 5     <saml:NameID Format="urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress">xiaosy@bw30.com</saml:NameID>
 6     <saml:SubjectConfirmation Method="urn:oasis:names:tc:SAML:2.0:cm:bearer">
 7       <saml:SubjectConfirmationData NotOnOrAfter="2024-01-18T06:21:48Z" Recipient="http://sp.example.com/demo1/index.php?acs" InResponseTo="ONELOGIN_4fee3b046395c4e751011e97f8900b5273d56685"/>
 8     </saml:SubjectConfirmation>
 9   </saml:Subject>
10   <saml:Conditions NotBefore="2014-07-17T01:01:18Z" NotOnOrAfter="2024-01-18T06:21:48Z">
11     <saml:AudienceRestriction>
12       <saml:Audience>http://sp.example.com/demo1/metadata.php</saml:Audience>
13     </saml:AudienceRestriction>
14   </saml:Conditions>
15   <saml:AuthnStatement AuthnInstant="2014-07-17T01:01:48Z" SessionNotOnOrAfter="2024-07-17T09:01:48Z" SessionIndex="_be9967abd904ddcae3c0eb4189adbe3f71e327cf93">
16     <saml:AuthnContext>
17       <saml:AuthnContextClassRef>urn:oasis:names:tc:SAML:2.0:ac:classes:Password</saml:AuthnContextClassRef>
18     </saml:AuthnContext>
19   </saml:AuthnStatement>
20   <saml:AttributeStatement>
21     <saml:Attribute Name="uid" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:basic">
22       <saml:AttributeValue xsi:type="xs:string">test</saml:AttributeValue>
23     </saml:Attribute>
24     <saml:Attribute Name="mail" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:basic">
25       <saml:AttributeValue xsi:type="xs:string">test@example.com</saml:AttributeValue>
26     </saml:Attribute>
27     <saml:Attribute Name="eduPersonAffiliation" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:basic">
28       <saml:AttributeValue xsi:type="xs:string">users</saml:AttributeValue>
29       <saml:AttributeValue xsi:type="xs:string">examplerole1</saml:AttributeValue>
30     </saml:Attribute>
31   </saml:AttributeStatement>
32 </saml:Assertion>

 

  • 協議 (Protocol) 即通信:協議規定如何執行不同的行為。這些行為被細化成一些列的 Request 和 Response 對象,而在這些請求和相應的對象中包含了行為所特別需要的信息。比如,認證請求協議(AuthnRequest Protocol)就規定了一個 SP 如何請求去獲得一個被認證的與用戶。
    這是一個 AuthnRequest 對象示例:
1 <?xml version="1.0"?>
2 <samlp:AuthnRequest xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol" xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion" ID="ONELOGIN_809707f0030a5d00620c9d9df97f627afe9dcc24" Version="2.0" ProviderName="SP test" IssueInstant="2014-07-16T23:52:45Z" 
Destination
="http://idp.example.com/SSOService.php" ProtocolBinding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" AssertionConsumerServiceURL="http://sp.example.com/demo1/index.php?acs"> 3 <saml:Issuer>http://sp.example.com/demo1/metadata.php</saml:Issuer> 4 </samlp:AuthnRequest>
 
  • 綁定 (Binding) 即傳輸:綁定定義了 SAML 信息如何使用通信協議被傳輸的。比如,HTTP 重定向綁定,即聲明 SAML 信息將通過 HTTP 重定向消息傳輸;再比如 SAML SOAP 綁定,聲明了通過 SOAP 來傳遞 SAML 消息。比如上面 AuthnRequest 就聲明了 Http-POst 綁定

  • 元數據 (MetaData):SAML 的元數據是配置數據,其包含關於 SAML 通信各方的信息,比如通信另一方的 ID、Web Service 的 IP 地址、所支持的綁定類型以及通信中實用的密鑰等等。

四、SAML 協議流程分析:

SAML 協議內容比較復雜,綁定方式不只一個,在這里我們以應該算是最簡單的一種綁定方式 HTTP-POST 方式說明 SAML 協議的工作流程(好吧,其實是其他的還沒有了解呢 sweat<em>smile

7eca932fd80b4dc5af08af22a7eb934a_TIM20171220164630.png

1、用戶通過瀏覽器訪問 SP 的某個受保護的資源
2、SP 鑒別到該用戶未鑒權,於是將該用戶重定向到 IDP 端;前提是改 IDP 是受 SP 信任的身份認證中心;
3、IDP 端通過自己的認證方式對該用戶合法性進行認證;
4、認證通過后,IDP 端生成響應后返回給 SP
5、SP 接收到 IDP 的響應后解析出用戶認證信息,合法,則允許用戶訪問受保護的資源

接下來,我將分別從 SP 端和 IDP 端對一些常用的參數進行介紹,並且最后給出一個簡單的 demo, 敬請期待 smile


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM