一、什么是 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 協議的工作流程(好吧,其實是其他的還沒有了解呢 )
1、用戶通過瀏覽器訪問 SP 的某個受保護的資源
2、SP 鑒別到該用戶未鑒權,於是將該用戶重定向到 IDP 端;前提是改 IDP 是受 SP 信任的身份認證中心;
3、IDP 端通過自己的認證方式對該用戶合法性進行認證;
4、認證通過后,IDP 端生成響應后返回給 SP
5、SP 接收到 IDP 的響應后解析出用戶認證信息,合法,則允許用戶訪問受保護的資源
接下來,我將分別從 SP 端和 IDP 端對一些常用的參數進行介紹,並且最后給出一個簡單的 demo, 敬請期待