1. SAML斷言
斷言是一個包含零個或更多個由SAML權威做出的聲明的信息包。
SAML斷言通常與由<subject>元素表示的主體有關。
SAML權威可以生成三種不同的斷言聲明(所有符合SAML定義的聲明都與一個主體有關):認證、屬性、授權結果。
1.1 名稱標識符
作用:將參與方與標識符進行關聯。在某些情況下,需要限制標識符的使用范圍、通過名稱限定詞使得不同實體對同樣名稱的理解是一致的、通過對標識符加密增強其隱私保護性。
1.1.1 <BaseID>元素
<BaseID>元素是一個擴展點,使得應用程序可以添加新類型的標識符。其類型為BaseIDAbstractType(該類型是一個抽象類型,只能作為被繼承的源類型),包括下列用來擴展的屬性:
a. NameQualifier 【可選】:限定該標示符的安全域或管理域,該屬性與標識符聯合使用,避免同名用戶沖突。
b. SPNameQualifier 【可選】:使用SP的名稱進一步限定標識符,該屬性為依賴方提供了一種聯合標識符的方法。
1.1.2 NameIDType復合類
當元素通過字符串描述一個實體時,需要使用NameIDType復合類。它比<BaseID>元素擁有更加嚴格的限制,是<NameID>和<Issuer>元素的底層類型,包括下列屬性:
a. NameQualifier 【可選】:限定該標識符的安全域或管理域
b. SPNameQualifier 【可選】:使用服務提供者的名稱進一步限定標識符
c. Format【可選】:一個URI指針,用于描述基于字符串的標識符所屬的類別。如果沒有指定,將使用SAML:1.0:nameid-format:unspecified作為默認值
d. SPProvidedID【可選】:服務提供者建立的一個與元素中的主標識符不同的名稱標識符。
1.1.3 <NameID>元素
<NameID>元素為NameIDType類型,用在<Subject>和<SubjectConfirmation>元素等多種SAML斷言結構和多種協議消息中。
1.1.4 <EncryptedID>元素
<EncryptedID>元素為EncryptedElementType類型,包含一個加密的標識符元素。<EncryptedID>元素包含:
a. <xenc:EncryptedData>【必需】:加密內容及相關細節。其Type屬性應該存在,應包含值http://www.w3.org/2001/04/xmlenc#Element。加密內容應包含一個NameIDType或AssertionType類型的元素、或繼承BaseIDAbstractType、NameIDType和AssertionType的元素。
b.<xenc:EncryptedKey>【0個或多個】:打包解密密鑰。每個解密密鑰應該包含一個Recipient屬性,指出該密鑰加密的實體,該屬性的值應該為SAML系統實體的URI標識符。
1.1.5 <Issuer>元素
<Issuer>元素為NameIDType復合類型,提供了SAML斷言或協議消息的簽發者信息。該元素應使用字符串作為簽發者的名稱,該元素的Format值沒有指定則以urn:oasis:name:tc:SAML:2.0:nameid-format:entity作為默認值。
1.2 斷言
1.2.1 <AssertionIDRef>元素
<AssertionIDRef>元素使用唯一的標識符來創建一個SAML斷言的引用。
1.2.2 <AssertionURIRef>元素
<AssertionURIRef>元素使用URI指針來引用SAML斷言。
1.2.3 <Assertion>元素
<Assertion>元素為AssertionType復合類型。該類型對斷言包含的基本信息進行了說明,包括:
a. Version 【必需】:斷言的版本,本標準對應的是“2.0”
b. ID 【必需】:斷言的標識符,用xs:ID格式標識,遵循唯一性要求
c. IssueInstant 【必需】:使用UTC格式表示斷言簽發時間
d. Issuer 【必需】:聲明該斷言的簽發者。
e. <ds:Signature> 【可選】:用來保護斷言完整性和認證簽發者的XML簽名
f. <Subject> 【可選】:斷言中聲明的主體
g. <Condition> 【可選】:當使用斷言或者驗證斷言時,應對條件進行評價
h. <Advice> 【可選】:進行操作時附加的幫助信息,應用程序可根據需要忽略這些信息
斷言中還包含零個或多個下列元素:
i. <Statement>:聲明,應使用xsi:type屬性來指出其具體類型
j. <AuthnStatement>
k. <AuthzDecisionStatement>
l. <AttributeStatement>
一個不包含聲明的斷言應包含一個<Subject>元素,這樣的斷言確定了一個主體但不包含任何該主體的其他信息。
根據具體協議要求,SAML斷言的簽發者通常需要經過認證并擁有完整性保護。認證和完整性保護可以由協議綁定提供的機制來完成。
1.2.4 <EncryptedAssertion>元素
<EncryptedAssertion>元素描述了一個加密的斷言,該元素包含以下元素:
a. <xenc:EncryptedData> 【必需】:加密內容及相關細節,其加密部分應包含一個源自AssertionType的元素。
b. <xenc:EncryptedKey> 【0個或多個】:打包解密密鑰
1.3 主體
1.3.1 <Subject>元素
可選的<subject>元素確定了斷言內所有聲明(0個或多個)的共同主體,包含一個標識符或若干個主體證明:
a. <BaseID>、<NameID>或<EncryptedID> 【可選】 確定主體
b. <SubjectConfirmation> 【0個或多個】可以證明主體的信息。如果存在一個以上的主體證明,則檢驗其中任意一個即可。
一個<subject>元素可以同時包含標識符及主體證明,使得RP可以在處理斷言時進行校驗。如果不包含主體證明,斷言的提交者與主體間不存在任何關系。
一個subjecct元素不應該定義一個以上的主體。
1.3.2 <SubjectConfirmation>元素
SubjectConfirmation元素為依賴方提供了檢驗主體的方法,它包含以下屬性和元素:
a. Method 【必需】:指向確定主體的協議或機制的URI指針,協議使用者可以通過定義新的URI或私下協商來引入新的方法。
b. BaseID、NameID、EncryptedID 【可選】:標明要驗證是否滿足主體證明請求的實體
c. SubjectConfirmationData 【可選】:某些證明方法需要的額外信息,例如一個<ds:KeyInfo>元素可用來代表一個密鑰,其他標準可對SubjectConfirmationData中包含的信息內容作具體要求。
1.3.3 <SubjectConfirmationData>元素
提供可以證明主體的額外信息。當RP需要檢驗提出斷言的實體(即證明實體)和斷言宣稱的主體的關系時,需要使用主體證明。主體證明包含了下列可選元素:
a. NotBefore 【可選】: UTC格式的證明起始時間
b. NotOnOrAfter 【可選】: UTC格式的證明結束時間
c. Recipient 【可選】:限定斷言應發送到特定的網絡終端以避免中間人攻擊
d. InResponseTo 【可選】:將一個SAML請求與該斷言關聯
e. Address 【可選】:證明實體可發布斷言的網絡地址,該屬性可將特定的終端地址與斷言綁定以避免攻擊者輕易的竊取和發布斷言。
f. Arbitrary attributes: 本復合類使用了<xs:anyAttribute>擴展點,從而可以在<SubjectConfirmationData>結構上添加任意的命名空間限定的XML屬性,而不需要提出特定的擴展方案。
g. Arbitrary element:本復合類可利用<xs:any>擴展點在<subjectConfirmationData>結構上添加任意的XML元素,而不需要定義專門的擴展方案。
如果時間限定存在,應該包含于<Conditions>元素的NotBefore和NotOnOrAfter屬性中,且本復合類中NotBefore應早于NotOnOrAfter。
1.3.4 KeyInfoConfirmationDataType復合類
KeyInfoConfirmationDataType復合類要求<SubjectConfirmationData>元素應包含若干個<ds:KeyInfo>元素,用<ds:KeyInfo>元素來指明認證證明方的密文密鑰。證明方法中應詳細定義數據使用的機制。
1.3.5 經密鑰認證的<Subject>實例
為了描述上述元素和類型如何共同使用,下面給出一個包含名稱標識符和主體證明的<Subject>元素的實例。注意其中使用KeyInfoConfirmationDataType復合類型包含的ds:KeyInfo元素來定義證明信息的方式。
<subject>
<NameID Format="****:nameid-format:emailAddress"> scott@example.org</NameID>
<SubjecConfirmation Method = "****:holder-of-key">
<SubjectConfirmationData xsi:type = "saml:KeyInfoConfirmationDataType">
<ds:keyInfo>
<ds:KeyName>Scotts Key</ds:KeyName>
</ds:KeyInfo>
</SubjectConfirmationData>
</SubjecConfirmation>
</subject>
1.4 條件
1.4.1 <conditions>元素
<conditions>元素可以包含下列元素和屬性:
a. NotBefore 【可選】 斷言最初生效時間 UTC編碼
b. NotOnOrAfter 【可選】 斷言失效時間 UTC編碼
c. Condition 【任意數目】 在一個擴展方案中某個類型的條件,應使用xsi:type來指明實際的條件類別。
d. AudienceRestriction 【任意數目】 指定斷言只能針對特定依賴方發布
e. OneTimeUse 【可選】 指定斷言應當立即被使用,不應保留備用。盡管方案允許多次出現,但對此元素應至多只有一個實例。
f. ProxyRestriction 【可選】 指定斷言發送方對符合下列條件的依賴方作出的限制,依賴方希望下一步自己作為斷言發送方根據初始斷言中包含的信息發布自己的斷言。盡管方案允許多次出現,但對此元素應至多只有一個實例。
1.4.1.1 屬性NotBefore和NotOnOrAfter
屬性NotBefore和NotOnOrAfter指定了斷言在其使用上下文中斷言有效性的時間限制。
1.4.1.2 <Condition>元素
<Condition>元素是為新條件提供的擴展點。其中的ConditionAbstractType復合類是抽象的,所以只可用作一個衍生類的基礎。
1.4.1.3 <AudienceRestriction>與<Audience>元素
AudienceRestriction元素指定該斷言將被發送給Audience元素所標識的一個或多個特定的依賴方。雖然特定依賴方之外的一個SAML依賴方也能從該斷言中獲得信息,但SAML斷言發送方沒有對這樣的依賴方明確做出任何精確或可信的陳述。
AudienceRestriction包含以下元素:Audience。
Audience是一個URI指針,標識了一個特定的依賴方,此URI指針可能標識一個文檔,該文檔描述了接收群的限制與條件。它也可能包含一個唯一的標識符URI,代表一個系統實體的SAML名稱標識符。
需要注意的是,一個斷言中可能包含多個<AudienceRestriction>元素,每個元素應獨立判斷。再需求和以上定義的共同作用下,對給定條件,依賴方間的關系是或(or),多重條件間的關系是與(and)。
1.4.1.4 OneTimeUse元素
一般情況下,依賴方可以選擇保留斷言或以其他形式保留斷言中的信息,以備重用。OneTimeUse元素使得一個權威機構可以指定斷言中的信息可能頻繁變化,每次使用都應該獲取最新的信息。
如果分布式環境中的系統時鐘可以精確同步,則此需求可以通過精心使用有效期的方式來滿足,然而由于系統間的時鐘誤差存在以及可能出現的傳輸延遲,因此發布方沒有便捷的方法既能適當地限制斷言的有效期,又可避免斷言可能在到達依賴方前就已失效的風險。
OneTimeUse元素指明依賴方應該立即使用該斷言,不允許保留以備后用。依賴方可以在每次使用時請求一個新的斷言。
為了支持此一次性使用的限制,依賴方需要維護一個斷言緩存,保存其所處理過的包含此條件的斷言。一旦處理到包含此條件的斷言,就檢查緩存,確保本依賴方此前沒有接受處理過同一條斷言。(是只緩存指定時間間隔里斷言,會不會存在安全問題)
一個SAML權威不允許在一個斷言的某個<Conditions>元素中包含多于一個<OneTimeUse>元素。為了確定<Conditions>元素的有效性,<OneTimeUse>元素始終有效。即,此條件是一個使用條件,不影響斷言的有效性。
1.4.1.5 ProxyRestriction元素
該元素指定了斷言發送方對依賴方的限制,指定哪些依賴方下一步可作為斷言發送方,發布其在初始斷言包含的信息基礎上自行生成的斷言。違反該元素中限制的依賴方不得作為斷言發送方發布的一個斷言。
<ProxyRestriction>元素包含下述元素和屬性:
a. Count 【可選】 指定了斷言發送方允許存在于本斷言與基于其發布的最終斷言間的間接斷言的最大數目。
b. Aduience 【0個或多個】指定了斷言發送方允許的,基于本斷言產生的新斷言可發送到的依賴方的集合。
如果沒有指定<Audience>元素,則沒有向依賴方施加發布后續斷言的依賴方限制。否則,這樣發布的斷言中應包含一個<AudienceRestriction>元素,其中至少包含本斷言<ProxyRestriction>元素中的一個Audience,并且要求不得包含本斷言的ProxyRestriction元素中不包括的Audience元素。
一個SAML權威不允許在一個斷言的Conditions元素中包含多于一個的ProxyRestriction元素。為了確定元素Conditions的有效性,ProxyRestriction條件始終有效,亦即,此條件是一個使用條件,不影響斷言的有效性。
1.4.1.6 一般處理規則
如果一個斷言中包含元素Conditions,則該斷言的有效性依賴于所給出的子元素與屬性,所采用的規則如下所述(是有優先級的,即依次匹配a,b,c,d):
a. 如果元素<conditions>中沒有子元素或屬性,則該斷言經過條件處理是有效的;
b. 如果元素<conditions>中的任何子元素或屬性是無效的,則該斷言是無效的;
c. 如果元素<conditions>中的任何子元素或屬性的值不可讀,或元素不可理解,則該斷言的有效性無法確定,該斷言是不確定的;
d. 如果元素Conditions中的所有子元素與屬性是有效的,則該斷言經過條件處理是有效的。
無效或不確定的斷言應被依賴方丟棄,和該斷言形式錯誤或不可使用的情況下的處理方式相同。
1.5 建議
<Advice>元素中包含SAML權威希望提供的所有附加信息。這些信息可以忽略,既不會影響斷言的語義,也不會影響斷言的有效性。
<Advice>元素包含0個或多個<Assertion>、<EncryptedAssertion>、<AssertionIDRef>、<AssertionURIRef>元素,以及非SAML命名空間的其他命名空間有效元素。
下面是Advice元素的一些應用:
--包含支持斷言聲明被引用的證據
--陳述斷言聲明的依據
--指定斷言更新的時間與發布點。
1.6 聲明
1.6.1 Statement元素
Statement元素是一個擴展點,使得其他基于斷言的應用能夠重用SAML斷言框架。SAML自身就是從此擴展點得出其核心聲明的。該元素所屬的StatementAbstractType復合類是抽象的,所以只可用作一個衍生類的基礎。
1.6.2 AuthnStatement元素
AuthnStatement元素描述了SAML權威做出的聲明,聲稱斷言主體是在特定時間以特定方式被認證的。包含<AuthnStatement>元素的斷言應包含一個Subject元素。AuthnStatement包括下列元素與屬性:
a. AuthnInstant 【必需】:指定了認證發送的時間,采用UTC編碼
b. SessionIndex 【可選】:指定了SAML主體所標識的主體與認證權威間特定會話的索引
c. SessionNotOnOrAfter 【可選】: 指定了SAML主體所標識的主體與發布此聲明的SAML權威間的會話應終止的時刻。此時間值采用UTC編碼,此屬性與此斷言中可能存在的NotOnOrAfter條件間沒有必然關系。
d. SubjectLocality 【可選】: 指定了被認證的斷言主體的系統的DNS域名與IP地址。
e. AuthnContext 【必需】:產生該聲明的認證事件中的認證權威所使用的上下文。其中包含一個認證上下文類指針,一個認證上下文聲明或聲明的指針,或聲明和聲明指針兩者都有。
通常,任何字符串值都可以用作SessionIndex值。然而,當考慮隱私時,應注意包裝SessionIndex值不會使得其他隱私機制失效。因此,SessionIndex值不能被用來關聯一個主體與不同會話對象間的活動。推薦使用下列方法:
--SessionIndex值采用小正整數(或一個列表中的重用常數值)。SAML權威應該選擇該值的范圍,使得集合中元素的個數充分的多,以防止特定主體與多個會話對象間的活動被關聯。SAML權威應該在此范圍內隨機選擇SessionIndex值(在保證唯一值的前提下進行)。
--在SessionIndex中使用封裝的斷言ID值。
1.6.2.1 SubjectLocality元素
SubjectLocality元素指定了認證斷言主體的系統DNS域名與IP地址。SubjectLocality包含下列屬性:
a, Address 【可選】 認證斷言主體標識的主體系統的網絡地址。
b. DNSName 【可選】 認證斷言主體標識的主體系統的DNS域名。
由于以上兩個屬性值都十分容易被欺騙,所以本元素完全用于參考,只在某些應用中可能是有用的信息。
1.6.2.2 AuthnContext元素
AuthnContext元素指定了一個認證事件的上下文。此元素可以包含一個認證上下文類指針,一個認證上下文聲明或聲明指針,或聲明及聲明指針兩者都有。其復合類AuthnContextType中含有以下元素:
a. AuthnContextClassRef 【可選】標識一個認證上下文種類的URI指針,認證上下文種類描述了其后的認證上下文聲明。
b. AuthenticatingAuthority 【0個或多個】 與主體認證有關的0個或多個認證權威的唯一標識符(不包括斷言發送方,假定其必定相關因此無需在此特別指定)
1.6.3 AttributeStatement元素
AttributeStatement元素描述SAML權威的聲明,用于聲稱斷言的主體與指定屬性相關聯。包含AttributeStatement元素的斷言應包含一個Subject元素。
AttributeStatementType類通過附加下述元素與屬性,擴展了StatementAbstractType類:
a. Attribute或EncryptedAttribute 【一個或多個】
1.6.3.1 Attribute元素
Attribute元素標識屬性名并可選地包含其屬性值。該元素屬于AttributeType復合類,可以用在一個屬性聲明中,用來描述與斷言主體相關的特定屬性及屬性值;也可用于屬性查詢中,用來請求返回特定SAML屬性的值。Attribute元素包含以下XML屬性:
a. Name 【必需】屬性名
b. NameFormat 【可選】 用于對屬性名進行解釋的表示屬性名分級的URI指針。
c. FrientlyName 【可選】 提供屬性名的可讀串形式,在實際Name復雜或不透明的情況下(如OID或UUID)可能有所幫助。本屬性不能用來正式標識SAML屬性值
d Arbitrary attributes 本復合類采用一個xs:anyAttribute擴展點來向結構Attribute中添加任意的XML屬性而不需要明確的方案擴展。
e. AttributeValue 【任意數目】 包含屬性的一個值。如果一個屬性包含有超過一個的不連續值,建議將出現的每個值都使用單獨的attributeValue元素存放。如果此屬性中有多于一個的AttributeValue元素,且其中任意元素通過xsi:type分配了一個數據類型,則所有AttributeValue元素應分配同一個數據類型。
一個Attribute元素中若不包含AttributeValue元素,則其意義依賴于其上下文。在一個AttributeStatement元素中,如果SAML屬性存在但是沒有值,則AttributeValue元素應被忽略。在samlp:attributeQuery中,如果出現沒有值的情況,則意味著請求者對指定屬性的任意或所有值感興趣。
AttributeValue元素提供了SAML屬性的值,它是一個xs:anyType類,允許任何形式正確的XML出現在元素內容中。
如果一個SAML屬性包含一個空值,例如空串,則相應的AttributeValue元素應為空(一般表示為<AttributeValue/>)。這條規則的優先級高于SAML內容的串值至少包含一個非空白字符的需求。
如果SAML屬性包含一個null值,則其相對應的AttributeValue元素應為空,且應包含保留的xsi:nil XML屬性,其值為true或1
1.6.3.2 EncryptedAttribute元素
EncryptedAttribute元素代表一個加密SAML屬性。EncryptedAttribute元素包含下列元素:
a. xenc:EncryptedData 【必需】:加密內容與相關加密細節。其Type屬性應該存在,加密內容應包含一個元素,該元素應衍生自AttributeType類型。
b. xenc:EnncryptedKey 【0個或多個】 封裝的解密密鑰,每個解密密鑰都應該包含一個Recipient屬性,指定該密鑰加密的實體。Recipient屬性的值應該是一個URI標識符,標識一個擁有SAML名字標識符的系統實體。
1.6.4 AuthzDecisionStatement元素
AuthzDecisionStatement元素描述了一個SAML權威的聲明,該聲明表明,基于某些可選的證明,斷言主體訪問指定資源的請求已經獲得了指定的授權決策結果。包含該元素的斷言應包含一個Subject元素。
資源以URI指針方式標識。為了正確安全地解釋斷言,SAML權威與SAML依賴方應以一致的方式解釋每一個URI指針。如果不能在URI指針解釋上達成一致,會因資源URI指針的編碼差異而導致不一致的授權決策。
為避免因URI編碼差異導致歧義,SAML系統實體應盡可能地按照以下要求使用URI標準形式:
--SAML權威應該以標準形式編碼所有資源URI指針
--依賴方應在處理前優先將資源URI指針轉換為標準形式。
不一致的URI指針解釋也可能因底層文件系統的URI指針語法語義的差異導致。當URI指針被用作指定一種訪問控制策略語言時,需要特別注意。使用SAML斷言的系統應滿足下列條件:
--部分URI指針語法是大小寫敏感的,如果底層文件系統是大小寫敏感的,請求者不能通過改變部分資源URI指針的大小寫來訪問一個禁止訪問的資源
--許多文件系統支持邏輯路徑與符號鏈接等機制,這使得用戶可以在文件系統入口間建立邏輯等價。請求者不能通過建立這種等價來訪問一個禁止訪問的資源。
AuthzDecisionStatement元素術語AuthzDecisionStatementType類,通過附加下列元素與屬性擴展了StatementAbstractType類:
a. Resource 【必需】 標識請求授權訪問的資源URI指針,此屬性中的URI指針值可能為空(”“),其意義定義為”當前文檔的起始“
b. Decision 【必需】 SAML權威做出的關于給的資源的決策,其值是簡單類DecisionType。
c. Action 【一個或多個】 獲得授權,可在指定資源上執行的操作的集合
d Evidence 【可選】 SAML權威做出決定時依賴的一組斷言
1.6.4.1 簡單類 DecisionType
簡單類DecisionType定義了在授權決策聲明中可能的決策狀態值:
a. Permit 允許該行為
b. Deny 禁止該行為
c Indeterminate SAML權威不能確定指定行為應被允許還是禁止。其在下述情況使用:SAML權威需要有能力提供一個確定的聲明,但是在某些情況下卻無法發布決策。
拒絕或不能提供決策的原因可以作為附加信息以StatusDetail元素的形式封裝在Response中返回。
1.6.4.2 Action元素
Action元素指定了向指定資源申請權限的行為,以字符串數據的形式提供了這些行為的標簽,并且包含以下屬性:
a. Namespace 【可選】 表示解釋指定行為名稱的命名空間的URI指針。若此元素不存在,則****:rwedc-negation有效 ?---國標中該項在schema描述中是required
1.6.4.3 Evidence元素
Evidence元素包含一個或多個斷言或斷言指針,SAML權威依賴這些斷言或斷言指針來發布授權決定。它屬于EvidenceType復合類,包含一個或多個下列元素:
a. AssertionIDRef 【任意數目】 通過以該斷言的ID屬性值作為指針的方式指定一個斷言;
b. AssertionURIRef 【任意數目】 通過一個URI指針的方式指定一個斷言;
c. Assertion 【任意數目】 通過值指定一個斷言
d. EncryptedAssertion 【任意數目】 通過值指定一個加密斷言
作為依據的斷言可以影響SAML依賴方與作出授權決定的SAML權威間的信任一致性。例如,SAML依賴方在請求中向SAML權威方提交一個斷言的情況下,SAML權威可以使用該斷言作為作出授權決策的依據,無論對于依賴方還是對于其他第三方,都無需將evidence元素的斷言簽署為有效。
2. SAML協議
SAML協議消息可以通過多種協議生成和交換。SAML bindings specification描述了使用常用的傳輸協議來傳輸協議消息的標準化方法。SAML profile specification描述了本章提到的多種協議的應用以及額外的規則、限定和增強互操作性的要求。
標準化的SAML請求和響應消息起源于通用類型,請求者向響應者發送一個RequestAbstractType的衍生類元素;然后響應者生成一個與StatusResponseType類型兼容或者該類型的衍生類元素。
在特定情形中,當允許時,SAML響應可以不由接收請求的實體生成。
SAML協議完成以下操作:
--返回一個或多個斷言,作為直接請求或斷言詢問的響應;
--對請求進行認證并返回相應斷言;
--注冊一個名稱標識符或終止一個名稱注冊請求;
--生成一個通過artifact方式請求的協議消息;
--對一系列相關進程執行同步登出(單點登出)
--為請求提供一個名稱標識符映射
SAML各組成協議之間的關系:方案和命名空間定義了協議的作用范圍;在方案和命名空間的范圍內定義了RequestAbstractType復合類型與StatusResponseType復合類型,所有SAML請求類型都是以RequestAbstractType復合類型為基礎進行擴展而得來的,所有SAML響應類型都是以StatusResponseType復合類型為基礎進行擴展而得來的;針對主體與客體間會話目的不同,各個協議分別對主體與客體間的請求和響應的內容和格式進行了一系列的規定。
2.1 請求與響應
2.1.1 RequestAbstractType復合類型
本類型定義了與SAML請求相關的通用的屬性和元素:
a. ID 【必需】 請求的標識符 屬于xs:ID類型,且應符合唯一性要求。請求中的ID屬性的值與響應中的InResponseTo屬性的值應匹配
b. Version 【必需】 請求的版本,本標準中定義的標識符版本為2.0
c. IssueInstant 【必需】 UTC編碼的請求時間
d. Destination 【可選】 指向請求接收地址的URI指針。可實現某些協議綁定中避免惡意轉發的要求。如果本屬性存在,接收者應檢查該URI指針以識別消息的目的地是否匹配。如果不匹配,該請求應被拋棄。
e. Consent 【可選】 指出是否從發送此請求的主體處獲得了一個許可。
f. <saml:Issuer> 【可選】 標識生成請求消息的實體
g. <ds:Signature> 【可選】XML簽名,用于認證請求者和提供完整性保護
h. Extensions 【可選】經過雙方協商的包含可選協議消息擴展元素的擴展點。即使使用擴展的方案,松校驗設定也不對擴展的有效性作強制要求。
根據具體協議和配置文件的要求,SAML請求者通常需要對自己進行認證并保護消息的完整性。認證和完整性保護可以由協議綁定提供的機制來完成。為了認證請求者和保護完整性,SAML請求可以使用簽名。如果應用了簽名,則應同時使用ds:signature元素,且響應方應對簽名的有效性進行檢驗;如果簽名無效,則返回錯誤;如果有效,響應方應對簽名進行評價以決定簽發者的身份及其適當性。
如果請求包含Consent屬性并且一些主要的許可已經獲得,則該請求應該被簽名。
如果SAML響應者認為一個請求無效,則其響應時應在響應消息中返回一個包含值為***:Requester的<StatusCode>元素。在某些情況下(如懷疑被DoS攻擊),可以不進行響應。
2.1.2 StatusResponseType復合類型
所有SAML響應都起源于StatusResponseType復合類型,本類型定義了與SAML響應相關的通用的屬性和元素:
a. ID 【必需】 響應的標識符,屬于xs:ID類型,符合標識符唯一性要求
b. InResponseTo 【可選】 指向SAML響應對應的請求標識符的指針。如果響應不針對請求生成,或請求中的ID屬性值不能確定(例如請求畸形),則本屬性不應存在。除去以上情況,此屬性應存在,且其值應與相應請求中的ID屬性相匹配。
c. Version 【必需】 響應的版本,本標準對應的應為2.0
d. IssueInstant 【必需】 UTC編碼的請求時間 (標識內容應出錯,是響應簽發的時間)
e. Destination 【可選】 指向響應接收地址的URI指針。可實現某些協議綁定中避免惡意轉發的要求。如果本屬性存在,接收者應檢查該URI指針以失敗消息的目的地是否匹配。如果不匹配,該響應應被拋棄。
f. Consent 【可選】 指出是否從發送此響應的主體處獲得了一個許可。
g. <saml:Issuer> 【可選】 標識生成響應消息的實體
h. <ds:Signature> 【可選】XML簽名,用于認證響應者和提供完整性保護
i. <Extension> 【可選】 經過雙方協商的包含可選協議擴展元素的擴展點
j. Status 【必需】 描述相應請求狀態的編碼
根據具體協議的要求,SAML響應者通常需要對自己進行認證并保護消息的完整性。認證和完整性保護可以由協議綁定提供的機制來完成。SAML響應可以通過簽名來認證響應者和提供完整性保護。
如果應用了簽名,則應同時使用<ds:Signature>元素,且接收該響應的請求者應對簽名的有效性進行檢驗。如果響應包含Consent屬性且其值指出某些形式的主體許可已經獲得,則該響應應該被簽名。
2.1.2.1 Status元素
Status元素包含以下元素:
a. StatusCode 【必需】 描述響應行為的狀態編碼
b. StatusMessage 【可選】可以返回給操作者的一條消息
c. StatusDetail 【可選】 與請求狀態相關的附加信息。由0個或多個任意命名空間內的元素組成,且不包含任何關于方案的要求。
2.1.2.2 <StatusCode>元素
StatusCode元素定義了描述相應請求狀態的編碼或嵌套的編碼集合。StatusCode包括以下元素和屬性:
a. Value 【必需】 狀態編碼值。本屬性包含一個URI指針,頂層<StatusCode>元素值應從本節中提供的頂層狀態列表中選擇。
b. StatusCode 【可選】 提供更多細節信息的底層狀態編碼。響應者可以忽略這些狀態編碼值以防止故意使用錯誤請求來探察信息的攻擊。
被允許用作頂層狀態的StatusCode值如下所示:***:Success、***:Requester(由于請求者的錯誤造成請求不能執行)、***:Responder(由于SAML響應方或SAML權威的錯誤造成請求不能執行)、****:VersionMismatch(版本錯誤)
次級狀態編碼:***:AuthnFailed (不能成功認證主體)、***:InvalidAttrNameOrValue(<saml:Attribute>或<saml:AttributeValue>中出現未預料或無效的內容)、 ***:InvalidNameIDPolicy(響應提供者不能或不愿支持請求的名稱標識符策略)、***:NoAvailableIDP ...
2.2 斷言查詢和請求協議
2.2.1 AssertionIDRequest
如果請求者知道若干斷言的唯一標識符,則可通過AssertionIDRequest消息元素來發出請求。在Response消息中返回這些斷言。
<complexType name="AssertionIDRequestType">
<complexContent>
<extension base = "samlp:RequestAbstractType">
<sequence>
<element ref = "saml:AssertionIDRef" maxOccurs="unbounded"/>
</sequence>
</extension>
</complexContent>
</complexType>
saml:AssertionIDRef元素用來限定每個返回的斷言。
2.2.2 查詢
2.2.2.1 SubjectQuery元素
SubjectQuery消息元素是一個擴展點,允許SAML主體通過該擴展點定義新的SAML查詢。其中SubjectQueryAbstractType復合類型為抽象類,只能作為其他衍生類型的源類型。
SubjectQueryAbstractType向RequestAbstractType類型添加了<saml:Subject>元素。
2.2.2.2 AuthnQuery元素
AuthnQuery消息元素用來查詢“哪些斷言包含適用于該主體的認證聲明?”。 一個成功的Response將返回一或多個符合查詢請求的斷言。
在本協議中,不得利用AuthnQuery中提供的信任憑證來獲取新的認證。
該元素屬于AuthnQueryType,由SubjectQueryAbstractType經下列元素和屬性擴展得到:
a. SessionIndex 【可選】 為可能的響應指定一個過濾器,查詢”哪些斷言包含進程上下文中提到的主體的認證聲明“
b. RequesetedAuthnContext 【可選】 為可能的響應指定一個過濾器,查詢”哪些斷言包含滿足元素中認證上下文提到的主體的認證聲明?”
為響應一個認證查詢,SAML權威返回包含以下認證聲明的斷言:
---返回匹配查詢中<subject>元素的斷言
---如果查詢中存在SessionIndex屬性,則返回的AuthnStatement元素中至少有一個應包含與查詢中SessionIndex屬性相匹配的SessionIndex屬性。是否返回所有匹配的斷言集合是可選的。
---如果查詢中存在RequestedAuthnContext元素,返回的集合中應至少包含一個滿足查詢中AuthnContext元素的AuthnStatement元素。是否返回所有匹配的斷言集合是可選的。
RequestedAuthnContext元素指定了查詢或請求響應中返回的認證聲明的上下文需求,并通過RequestedAuthnContextType復合類型定義:?
a. <saml:AuthnContextClassRef> or <saml:AuthnContextDeclRef> 【一個或多個】指定若干個URI指針來識別認證上下文類或聲明。
b. Comparison 【可選】定義評價上下文類或聲明的對照方法,為“exact”、“minimum”、“maximum”或“better”之一,其中“exact”為默認。如果Comparison設置為“exact”或者被省略,則認證聲明中的上下文結果應精確匹配至少一個認證上下文;如果Comparison設置為“minimum”,則(響應者相信)認證聲明中的上下文結果應至少同一個認證上下文一樣強;如果Comparison設置為“better”,則(響應者相信)認證聲明中的上下文結果應強于至少一個認證上下文;如果Comparison設置為“maximum”,則(響應者相信)認證聲明中的上下文結果應在不超過的認證上下文中最強上限情況下盡可能強。
2.2.2.3 AttributeQuery元素
AttributeQuery元素用來生成一個“返回主體請求的屬性”查詢。一個成功的響應應該以包含屬性聲明的斷言的格式返回信息。本元素為AttributeQueryType類型,由SubjectQueryAbstractType添加下列元素擴展得到:
<saml:Attribute> 【任意數目】
每個<saml:Attribute>元素定義了一個將返回的屬性。如果沒有明確指定有哪些屬性,則表明所有策略允許的屬性都被請求。如果給出的一個<saml:Attribute>元素包含一個或多個<saml:AttributeValue>元素,則一旦該屬性被返回,返回的值應與查詢中指定的值嚴格相等。如果缺少專門的文檔或屬性來確定相等性規則,則相等性被定義為同樣的XML表示。
2.2.2.4 AuthzDecisionQuery元素
AuthzDecisionQuery元素用來生成一個“基于給定的證據,主體對這些資源的這些行為是否被允許?”的查詢,一個成功的響應應該以包含授權決定聲明的斷言的格式返回信息。
本元素屬于AuthzDecisionQueryType類型,由SubjectQueryAbstractType添加下列元素和屬性擴展得到:
a. Resource 【必需】 指向被請求資源的URI指針
b. saml:Action 【一個或多個】 授權請求的行為
c. saml:Evidence 【可選】 SAML權威可以用來作出授權決定的斷言集合。
2.2.3 Response元素
Response消息元素用來生成一個響應。該響應包含0個或多個滿足請求的斷言。Response元素屬于ResponseType復合類型,由StatusResponseType添加下列元素擴展得到:
a. <saml:Assertion>或<saml:EncryptedAssertion>【任意數目】 指定一個斷言或加密斷言
2.2.4 處理規則
為了響應SAML查詢消息,SAML權威返回的每個斷言應包含一個<saml:Subject>元素(記做S1),并要求該元素嚴格匹配查詢中的<saml:Subject>元素(記做S2);兩者嚴格匹配當且僅當同時滿足以下兩個條件:
---如果S2包含標識符元素(<BaseID>、<NameID>或<EncryptedID>),則S1應包含標識符元素。S1和S2中的標識符在解密后應相同。
---如果S2包含一或多個<saml:SubjectConfirmation>元素,則S1應包含至少一個saml:SubjectConfirmation,且能夠被S2中至少一個saml:SubjectConfirmation元素確認。
如果SAML權威不能提供任何滿足查詢或復合斷言索引限定的斷言,則Response元素中應不包含Assertion元素,且應包含一個值為******:Success的次級<StatusCode>。
2.3 認證請求協議
當一個主體(或主體代理)希望獲得包含認證聲明的斷言以建立一個安全上下文時,可以使用認證請求協議來向SAML權威發送一個<AuthnRequest>消息元素以請求SAML權威返回包含若干上述斷言的Response消息。返回的斷言可以包含任意類型的附加聲明,但至少有一個斷言應包含認證聲明。
支持本協議的SAML權威通常也稱作身份提供者。
除了滿足以上要求,返回斷言的內容還取決于其使用的配置文件或上下文。
本節中的描述和處理規涉及到以下參與者,在實際應用中,他們中的某些可能是同一實體:
a. 請求者: 創建認證請求及接受響應的實體。
b. 提交者:將請求提交給身份提供者的實體。如果提交者不是請求者,則其在請求者和身份提供者之間起中間人的作用。
c. 請求主體: 被請求斷言中的實體
d. 證明實體: 與結果斷言中某個<subjectConfirmation>元素相一致的實體。
e. 依賴方: 使用斷言達到配置文件中或使用上下文中定義的某種目的(通常是建立安全上下文)的實體。
f. 身份提供者 接收提交者發送的請求并作出響應的實體。
2.3.1 AuthnRequest元素
為了請求認證聲明,提交者向身份提供者發送一個AuthnRequest消息來描述響應斷言應具體的屬性。這些屬性包括斷言內容和/或Response消息的傳遞方法。對于提交者的認證處理可以在首次傳遞AuthnRequest消息之前、之中或之后進行。請求者和提交者可以不同,例如請求者可以是RP。
<AuthnRequest>消息應該被簽名或使用其他方法以進行認證和保護其完整性。
本消息屬于AuthnRequestType復合類型,由RequestAbstractType添加以下元素和屬性擴展得到,所有擴展都是可選的,但可能受特定的配置文件所限定:
a. <saml:Subject> 【可選】 ?定義了結果斷言的請求主體,可以包含一或多個<saml:SubjectConfirmation>元素來指出結果斷言可被誰證明。如果不包含標識符,則認為提交者是請求主體。如果不包含<saml:SubjectConfirmation>元素,則認為提交者是唯一證明方且證明方法來源于配置文件和/或身份提供者的策略。
b. <NameIDPolicy> 【可選】 描述了對主體名稱標識符的限定。如果省略,則可使用身份提供者支持的所有標識符類型或使用相關的已發布標識進行限定。
c. <saml:Conditions> 【可選】 定義了請求者期望的對結果斷言的有效性和/或使用方法進行限定的SAML條件。響應者可以對其進行必要的修改或補充。本元素中的信息將在建立斷言的過程中被當做輸入的參數。
d. <RequestedAuthnContext> 【可選】 定義了請求者向響應提供者提出的關于認證上下文的要求。
e. <Scoping> 【可選】 定義了請求者信任的,可用來認證提交者的身份提供者集合,或是響應者對AuthnRequest消息代理的限制和相關上下文。
f. ForceAuthn 【可選】 一個布爾值,如果為“true”,則身份提供者應直接認證提交者而不能依賴于先前的安全上下文。如果該值未提供,則默認為“false”。如果ForceAuthn和IsPassive同時為“true”,除非能夠滿足IsPassive約束,否則,身份提供者不得連續地認證提交者。
g. IsPassive 【可選】 一個布爾值,如果為“true",身份提供者和用戶代理不應在請求者和提交者交互中強制控制用戶接口。如果該值未提供,則默認為”false“
h. AssertionConsumerServiceIndex 【可選】 間接指出Response消息應該返回的位置。只在請求者和提交者使用不同的配置文件時應用。身份提供者應信任將給定的索引值映射到請求者相關位置的方法。如果該屬性被忽略,則身份提供者應按照配置文件中描述的默認位置返回Response。本屬性與AssertionConsumerServiceURL以及ProtocolBinding互斥。
i. AssertionConsumerServiceURL 【可選】 指定Response消息應被返回的位置。響應者應通過某些方法保證該限定位置確實與請求者有關。對封裝的AuthnRequest消息進行簽名可以滿足此種需求。本屬性與AssertioConsumerServiceIndex屬性互斥并通常與ProtocolBinding屬性一起使用。
j. ProtocolBinding 【可選】 指定Response返回時使用的SAML protocol binding的URI指針。本屬性與AssertionConsumerServiceIndex屬性互斥,并通常與AssertionConsumerServiceURL屬性配合使用。
k. AttributeConsumingServiceIndex 【可選】 間接指出請求者希望身份提供者在Response消息中提供的SAML屬性。身份提供者應信任將給定的索引值映射到相關屬性的方法。身份提供者可以使用這些信息來將若干saml:AttributeStatement元素組裝入返回的斷言內。
l. ProviderName 【可選】 定義了可讀的請求者名稱,該名稱被提交者的用戶代理或身份提供者使用。
2.3.1.1 NameIDPolicy元素
NameIDPolicy元素對斷言中的名稱標識進行裁剪,本元素的NameIDPolicyType復合類型定義了以下屬性:
a. Format 【可選】 定義了說明名稱標識符格式的URI指針。附加值****:encrypted用來限定請求結果中的標識符需要經過加密
b. SPNameQualifier 【可選】 定義了斷言主體標識符可使用的請求者以外的服務提供者的命名空間
c. AllowCreate 【可選】 用來指出身份提供者是否被允許在執行請求的過程中創建新的主體標識符的布爾值。默認為false。如果為“false”,請求者限定身份提供者只能在主體標識符已建立的情況下簽發斷言。
如果Format值被省略或被設置為**:unspecified,則身份提供者可以隨意返回任何種類的標識符。
如果策略需要,身份提供者可以不遵循Format中的限制而在結果斷言中返回一個EncryptedID
2.3.1.2 Scoping元素
Scoping元素定義了請求者信任的身份提供者以及響應者定義的與AuthnRequest消息代理相關的限制和上下文。ScopingType復合類型定義了以下元素和屬性:
a. ProxyCount 【可選】 定義了收到AuthnRequest的身份提供者與最終進行認證的身份提供者之間的最大代理數目;如果數目為零,則說明不允許代理,如果該屬性被忽略,則代表無限制。
b. IDPList 【可選】 可用的身份提供者信息列表
c. RequesterID 【0個或多個】 定義了請求實體集合,使用后續章節中的規則進行通信。
在包含中間方的配置文件中,中間方可以檢查該列表,如果中間方不能連接列表中的任何一個身份提供者或者列表中不包含中間方支持的身份提供者,則返回一個Response消息。
2.3.1.3 IDPlist元素
IDPlist元素定義了請求者信任的身份提供者,其IDPListType復合類型定義了以下元素:
a. IDPEntry 【1個或多個】 一個身份提供者的信息。
b. GetComplete 【可選】 如果IDPList不完整,則使用本元素來定義一個用來獲取完整列表的URI指針,該URI指針指向的資源應是一個根元素為IDPList且不包含GetComplete的XML實例。
IDPEntry元素定義了請求者信任的一個身份提供者,其IDPEntryType復合類型定義了以下屬性:
a. ProviderID 【必需】 身份提供者的唯一標識符
b. Name 【可選】可讀的身份提供者名稱。
c. Loc 【可選】 指向支持認證請求協議的一個終端的位置的URI指針,其綁定應與配置無關。
2.3.2 處理規則
AuthnRequest與Response的交互支持許多應用場景,在特定的上下文中也可以做典型的配置。
響應者應最終以一個Response消息回應一個AuthnRequest,該Response消息中包含符合請求中所定義規范的一個或多個斷言,或者包含一個描述了所發生錯誤的Status。響應者可以根據需要與提交者進行附加消息交換,以發起或完成認證過程,這一過程要依據所綁定的協議及認證機制的性質。
所有在AuthnRequest中定義的內容都是可選的,但在特定的配置文件中某些內容可能是必須的。如果沒有任何特定內容,默認滿足下列條件:
--返回的斷言應包含一個描述提交者的saml:Subject元素。標識符的類型與格式由身份提供者決定。但至少一個斷言中的至少一個聲明應是saml:AuthnStatement,且用來描述響應者或與其相關的認證服務進行的認證。
--請求的提交者應該是唯一能夠滿足斷言subjectConfirmation的證明實體。在確認方法較弱的情況下可以使用綁定的專門或其他機制來幫助滿足此需求。
--所得出的斷言應包含一個AudienceRestriction元素,用來向請求者提示一個合理的依賴方。
2.3.3 代理
如果一個收到AuthnRequest的身份提供者未認證提交者或者不能直接認證提交者,但是相信提交者已經通過另一個身份提供者或非SAML的等價實體的認證,它可以通過發布一個新的AuthnRequest給另一個身份提供者或者發布一個非SAML的等價實體可以識別的請求來獲得響應。此時,原始身份提供者成為代理身份提供者。當一個Response(或一個非SAML的等價實體)返回給代理提供者后,Response中所封裝的斷言(或非SAML等價體)可以用來認證提交者。這樣,代理提供者可以通過發布一個斷言來響應原始的AuthnRequest。
請求者可以通過加入一個包含ProxyCount值的Scoping元素影響代理的行為,并且/或者通過一個有序的IDPList來指定一系列優先選擇的可以提供代理的身份提供者。
一個身份提供者可以通過在它發布的斷言中使用一個ProxyRestriction元素來控制代理身份提供者對其斷言的后續使用。
代理提供者如果選擇一個SAML身份提供者作為身份提供者,在創建一個新的AuthnRequest時,代理身份提供者應包含與原始請求中的所有信息對等或更嚴格的格式。注意,代理提供者可以自由指定NameIDPolicy以使響應成功的可能性最大。
新的AuthnRequest應包含一個ProxyCount屬性,其值要比原始值至少少1.如果原始請求中不包含ProxyCOunt屬性,則新請求應該包含一個ProxyCount屬性。
如果原始請求中指定了一個IDPList,新請求中也應包含一個IDPList。代理身份提供者可以在IDPList的末尾添加額外的身份提供者,但是不得從列表中刪除任何身份提供者。
2.4 假名解析協議
假名解析協議提供了一種機制:SAML協議消息可以在SAML綁定中以指針引用而非數值的形式傳輸。利用此特殊的協議可以通過指針獲取請求與響應。消息發送方不需將消息綁定到一個傳輸協議上,而是使用綁定發送稱為假名的一小段數據。一個假名可以有多種形式,但應使接收方可以通過某種形式確定該假名由誰發送。如果接收方愿意,可以將協議與一個不同的(通常是同步的)SAML綁定協議聯合使用來將該假名解析為原始協議消息。
本機制的最普遍應用是由于規模限制導致綁定難以攜帶一個消息,或者是為了使一個消息可以通過一個安全信道在SAML請求者與響應方間傳輸,而不需使用簽名。
根據經由指針傳遞的消息的性質,假名解析協議可以要求所綁定的用來解析假名的協議提供諸如雙向認證、完整性保護和機密性等保護措施。在任何情況下,假名應以一次使用的語義出現,以保證當其被成功解析后,不會再被任何人使用。
2.4.1 ArtifactResolve元素
ArtifactResolve消息用來請求返回一條<ArtifactResponse>消息,該消息中包含一個假名代表的SAML協議消息。假名的初始傳輸由所使用的綁定協議負責。
應當使用用來發送消息的綁定協議來對消息ArtifactResolve進行簽名或認證,并提供完整性保護。
本消息為復合類ArtifactResolveType,它擴展了RequestAbstractType并添加了下列元素:
a. Artifact 【必需】 請求者收到的假名值,希望將其翻譯為它所代表的協議消息。
2.4.2 ArtifactResponse元素
收到ArtifactResolve消息后應以ArtifactResponse消息元素進行響應。此類型為復合類ArtifactResponseType,由StatusResponseType擴展而來,在其中加入一個可選的通配符元素(any namespace="##any" processContents="lax" minOccurs="0"/>),對應所返回的SAML協議消息。
應當使用用來發送消息的綁定協議來對消息ArtifactResponse進行簽名或認證,并提供完整性保護。
2.4.3 處理規則
如果響應方認為假名有效,則在消息元素ArtifactResponse中以相應的協議消息進行響應。否則,以無植入消息的元素ArtifactResponse進行響應。
響應方應確保任何假名只能使用一次的特性,可通過保證任何請求者對同一個假名的后續請求都導致上文描述的空響應來實現。
如果假名發布方從請求者處收到一個artifactResolve消息,且該消息不能認證請求者是原始指定的接收者,則假名發布方應返回一個空響應。假名發布方應當在一個假名的使用上施加最短的應用時間限制,這樣,在假名接收方獲得假名并將其在一個ArtifactResolve消息中返回發布方的過程中,存在一個接收時間窗口。
需要注意ArtifactResponse消息的InResponseTo屬性應包含與ArtifactResolve消息中ID屬性值相對應的值。
2.5 名稱標識符管理協議
在為一個主題建立一個名稱標識符后,身份提供者希望改變該標識符的值和/或格式以供未來引用該主體時使用,或者指明一個名字標識符不再用來引用該主體。這是,身份提供者就向服務提供者發送一個ManagementNameIDRequest消息來告知這種變化。
服務提供者也使用此消息來注冊或改變在通信時需要使用的名稱標識符的SPProvidedID值,或終止一個名稱標識符在其與身份呢提供者間的使用。
2.5.1 ManageNameIDRequest元素
提供者發送一個ManagementNameIDRequest消息來告知接收方一個更改了的名稱標識符,或者指明一個名稱標識符的使用終止。
應當使用用來發送消息的綁定協議對ManagementNameIDRequest消息進行簽名或認證,并提供完整性保護。
本消息為復合類ManagementNameIDPRequestType,擴展了RequestAbstractType,并添加了下列元素:
a. NameID或EncryptedID 【必需】 詳細說明主體的名稱標識符或相關描述數據(以明文或加密形式),該主體最近在此請求前曾被身份提供者或服務提供者確認過;
b. NewID或NewEncryptedID或Terminate 【必需】 新的名稱標識符(以明文或加密形式),在與進行請求的提供者通信時指代本主體,或表明舊標識符的使用已經終止。如果請求者是服務提供者,新的標識符應在元素NameID中的SPProvidedID屬性中出現;如果請求者是身份提供者,新的值應在元素NameID中作為元素內容出現。
2.5.2 ManagementNameIDResponse元素
ManagementNameIDRequest消息的接收方應以ManagementNameIDResponse消息進行響應,該消息為StatusResponseType類,沒有附加內容。
應當使用用來發送消息的綁定協議對ManagementNameIDResponse消息進行簽名或認證,并提供完整性保護。
2.5.3 處理原則
標識符的改變可能占用請求者與響應方的大量時間來向整個系統廣播此變動。具體實現可能希望允許每一方在一個名字標識符成功完成更新后一段時間內仍接受原有標識符。否則,可能導致主體不能訪問資源。
2.6 單點登出協議
單點登出協議提供了一個消息交換協議,通過此協議由特定會話權威提供的所有會話可以幾乎同步地終止。單點登出協議可以在一個主體從一個會話參與方或直接從一個會話權威登出的時候使用。此協議也可以在超出時限的情況下登出一個實體。登出事件的原因通過Reason屬性指出。
當主體從一個會話參與方處調用一個單點登出過程,會話參與方應發送一個LogoutRequest消息給提供斷言的會話權威,其中包含會話參與方中與會話相關的認證聲明。
當主體從會話權威處調用一個登出,或會話參與方代表該實體發送一個登出請求給會話權威時,會話權威應當發送一個消息LogoutRequest給那些未向該權威發送消息LogoutRequest的每個會話參與方,向他們提供的斷言中包含關于該主體的當前會話下的認證聲明。認證權威最終返回一個LogoutResponse消息到提出請求的會話參與方。
2.6.1 LogoutRequest元素
一個會話參與方或會話權威發送一個消息LogoutRequest來指明一個會話的終止。
應當使用用來發送消息的綁定協議對LogoutRequest消息進行簽名或認證,并進行完整性保護。
此消息為LogoutRequestType復合類型,它擴展了RequestAbstractType并加入了下列元素和屬性:
a. NotOnOrAfter 【可選】 請求失效的時間,如果超出此時間,接收方可以丟棄此消息,采用UTC編碼。
b. Reason 【可選】 以URI指針的形式指明登出原因。
c. BaseID或NameIDD或EncryptedID 【必需】 詳細說明主體的標識符與相關屬性(以明文或加密形式),該主體最近在此請求前曾被身份提供者與服務提供者確認過。
d. <SessionIndex> 【可選】 為消息接收方指示此會話的標識符。
2.6.2 LogoutResponse元素
LogoutResponse元素為StatusResponseType,沒有專門添加內容。
應當使用用來發送消息的綁定協議對消息LogoutResponse進行簽名或認證,并提供完整性保護。
2.6.3 處理規則
消息發送方可以使用Reason屬性來指明LogoutRequest的原因。本規范定義了***:logout:user表示主體希望終止指定會話;***:logout:admin表示管理者希望終止到該主體的指定會話。
2.6.3.1 會話參與方規則
當一個會話參與方收到一個LogoutRequest消息時,會話參與方應認證該消息。如果發送方是提供斷言的權威,斷言中包含一個連接到主體當前會話的認證聲明,會話參與方應通過BaseID、NameID、EncryptedID元素,或消息中給出的任何SessionIndex元素令所有指向的主體的會話無效。如果沒有提供SessionIndex元素,則應令所有與該主體相關的會話失效。
會話參與方應將登出請求消息應用到任何滿足下列條件的斷言,即使斷言在登出請求之后到達:
---斷言的主體嚴格匹配<logoutRequest>中的baseID、NameID或encryptedID元素;
---斷言認證聲明中的一個SessionIndex屬性匹配登出請求中描述的一個SessionIndex元素,或者登出請求不包含SessionIndex元素
---基于斷言自身描述的時間條件(尤其是在條件或主體證實數據中所描述的NotOnOrAfter屬性值)斷言有效;
---登出請求沒有超時(通過檢驗消息中的NotOnOrAfter屬性來確定)+++此規則的目的是避免會話參與方在收到一個真實的,可能仍然有效的斷言之前收到一個登出請求,其目標包括了剛收到的斷言的一個或多個斷言(由SessionIndex元素標識)。它應該保留登出請求直到登出請求自身可以被拋棄(超出了請求中的NotOnOrAfter值)或者登出請求的目標斷言已經被收到且已經被適當處理。
2.6.3.2 會話權威規則
當一個會話權威收到一個LogoutRequest消息,該會話權威應認證發送方。如果會話權威要提供包含對當前會話的認證聲明到發送方,則會話權威應當按照指定順序執行下列行為:
----發送一個LogoutRequest消息給任何由本會話權威代理了主體認證的其他會話權威;
---除了當前LogoutRequest消息的初始發送方外,發送一個LogoutRequest消息給每個本會話權威在當前會話中提供了斷言的會話參與方;
----終止主體當前會話,根據BaseID、NameID或EncryptedID元素,或登出請求消息中給出的任何SessionIndex元素的說明執行終止。
如果會話權威成功終止主體關于其自身的會話,則它對原始請求者做出響應(如果原始請求存在)。響應是一個LogoutResponse消息。
會話權威應當嘗試使用任何可應用的綁定協議來聯系各會話參與方,即使此種嘗試失敗或不能執行(例如因為初始請求的發生所使用的綁定協議不能將登出傳播給所有參與方)。
注意會話權威可以在未從一個會話參與方處收到一個LogoutRequet的情況下發起一個登出,原因包括但不限于:
---如果與一個會話參與方之間的某個時間期限過期,會話權威可以發送一個LogoutRequest到該會話參與方;
---一個達成共識的全局時間期限過期;
---一個主體或其他可信實體直接向會話權威請求主體登出;
---會話權威確定主體的證書被攻破
在構造一個登出請求消息時,會話權威應將消息中的NotOnOrAfter值設置成一個時間值,指明該消息的時限,在該時限之后,登出請求可以被接收方拋棄。此值應當被設置成一個等于或大于最新發布的斷言中的NotOnOrAfter值的時間值。