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值的时间值。