SAML 2.0

安全斷言標記語言 2.0 (SAML 2.0) 作為 SAML 的最新標準，用來在安全域中交換身份驗證（Authentication）數據和 授權（Authorization）數據。SAML 2.0基於XML協議，使用包含斷言（Assertions）的安全令牌在SAML授權方（即身份提供者，Identity_provider，縮寫為IdP）和SAML消費方（即服務提供者，Service Provider，縮寫為SP）之間傳遞委託人（通常是一個終端用戶）的資訊。SAML 2.0 可以實現基於網路跨域的單點登錄(SSO)，以便於減少向一個使用者分發多個身份驗證令牌的管理開銷。

SAML 2.0在2005年三月正式代替SAML 1.1成為OASIS標準。SAML 2.0的關鍵特徵在官方文檔SAMLCore, SAMLBind,SAMLProf和SAMLMeta中有詳細地記載。

來自超過24個公司及團體的大約30人參與了SAML 2.0的創建。尤其是，自由聯盟將身份聯合框架規範（ID-FF）貢獻給OASIS，後者成為了SAML 2.0規範的基礎。因此，SAML 2.0實際上是SAML 1.1, Liberty ID-FF 1.2和Shibboleth 1.3三種協議的融合。

## SAML 2.0斷言

斷言是一個包含了由SAML授權方提供的0到多個聲明（statement）的資訊包。SAML斷言通常圍繞一個主題生成。該主題使用`<Subject>`聲明。SAML 2.0規範定義了三種斷言聲明並且每一種都和一個主題相關。詳細資訊如下：

- 身份驗證（Authentication）斷言：該斷言的主題是在某個時間通過某種方式被認證。
- 屬性（Attribute）斷言：該斷言的主題和某種屬性相關聯。
- 授權決策（Authorization Decision）斷言：該斷言的主題被允許或者被禁止訪問某個資源。

一種非常重要的SAML斷言類型叫做「Bearer Assertion」。它主要是用來實現Web瀏覽器的單點登錄。下面是一個短期Bearer斷言的例子。一個IdP（https://idp.example.org/SAML2）發布了一個短期Bearer斷言到一個SP（https://sp.example.com/SAML2）。該斷言包括一個身份驗證斷言`<saml:AuthnStatement>`和一個屬性斷言`<saml:AttributeStatement>`。SP將使用該屬性斷言實現訪問控制。前綴`saml:`代表SAML 2.0斷言的命名空間。

### SAML斷言舉例

```xml
<saml:Assertion
   xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion"
   xmlns:xs="http://www.w3.org/2001/XMLSchema"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   ID="b07b804c-7c29-ea16-7300-4f3d6f7928ac"
   Version="2.0"
   IssueInstant="2004-12-05T09:22:05Z">
   <saml:Issuer>https://idp.example.org/SAML2</saml:Issuer>
   <ds:Signature
     xmlns:ds="http://www.w3.org/2000/09/xmldsig#">...</ds:Signature>
   <saml:Subject>
     <saml:NameID
       Format="urn:oasis:names:tc:SAML:2.0:nameid-format:transient">
       3f7b3dcf-1674-4ecd-92c8-1544f346baf8
     </saml:NameID>
     <saml:SubjectConfirmation
       Method="urn:oasis:names:tc:SAML:2.0:cm:bearer">
       <saml:SubjectConfirmationData
         InResponseTo="aaf23196-1773-2113-474a-fe114412ab72"
         Recipient="https://sp.example.com/SAML2/SSO/POST"
         NotOnOrAfter="2004-12-05T09:27:05Z"/>
     </saml:SubjectConfirmation>
   </saml:Subject>
   <saml:Conditions
     NotBefore="2004-12-05T09:17:05Z"
     NotOnOrAfter="2004-12-05T09:27:05Z">
     <saml:AudienceRestriction>
       <saml:Audience>https://sp.example.com/SAML2</saml:Audience>
     </saml:AudienceRestriction>
   </saml:Conditions>
   <saml:AuthnStatement
     AuthnInstant="2004-12-05T09:22:00Z"
     SessionIndex="b07b804c-7c29-ea16-7300-4f3d6f7928ac">
     <saml:AuthnContext>
       <saml:AuthnContextClassRef>
         urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport
       </saml:AuthnContextClassRef>
     </saml:AuthnContext>
   </saml:AuthnStatement>
   <saml:AttributeStatement>
     <saml:Attribute
       xmlns:x500="urn:oasis:names:tc:SAML:2.0:profiles:attribute:X500"
       x500:Encoding="LDAP"
       NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri"
       Name="urn:oid:1.3.6.1.4.1.5923.1.1.1.1"
       FriendlyName="eduPersonAffiliation">
       <saml:AttributeValue
         xsi:type="xs:string">member</saml:AttributeValue>
       <saml:AttributeValue
         xsi:type="xs:string">staff</saml:AttributeValue>
     </saml:Attribute>
   </saml:AttributeStatement>
 </saml:Assertion>
```