2.7 名称标识符映射协议
一个实体和身份提供者分享一个主体的主体标识符,当此实体希望为同一个主体获得一个指定格式或联合命名空间的名字标识符时,它可以使用此协议发送请求到身份提供者。
例如:SP1希望与SP2通信,却没有共享一个用户的标识,一个身份提供者分别与SP1、SP2共享该用户的标识符,SP1可以利用身份提供者将用户在SP1的标识映射到用户在SP2的标识(通常是加密的),利用该标识符,SP1可以与SP2通信。
除非专门指明加密是不必要的,否则无论所包含的的标识符的类型是什么,映射后的标识符都应当被加密成encryptedID。
2.7.1 NameIDMappingRequest 元素
为了给某主体向身份提供者请求一个名称标识符,请求者发送一个消息NameIDMappingRequest,本消息为NameIDMappingRequestType复合类型,它扩展了RequestAbstractType,并加入了下列元素:
a. BaseID或NameID或EncryptedID 【必需】 标识符与相关属性(以明文或加密形式)详细说明了主体
b. NameIDPolicy 【必需】 需要返回的关于标识符格式与可选名称限定的需求。
应当使用用来发送消息的绑定协议对NameIDMappingRequest进行签名或认证,并提供完整性保护。
2.7.2 NameIDMappingResponse元素
为NameIDMappingResponseType复合类型,扩展了StatusResponseType并添加了下列元素:
saml:NameID或saml:EncryptedID 【必需】 详细说明主体的标识符与相关属性
应当使用用来发送消息的绑定协议对NameIDMappingResponse进行签名或认证,并提供完整性保护。
2.8 SAML和XML签名句法与处理
SAML断言和协议请求响应消息可以使用签名。签名可带来以下好处:经过签名的断言支持断言完整性保护,可以认证断言和消息的发布方,如果签名基于发布方的公私钥对,签名还将保证不可否认性。
SAML中,数字签名并不是必要的,在某些情况下,签名可以通过继承得到,例如无签名的断言可以受到协议响应消息上签名的保护。
如果内部对象(如断言)拥有长时间的有效性,那么通过继承得到的签名需要被小心使用,为了保证其有效性,整个上下文都需要被保留。
另一个例子是SAML依赖方或请求方可能直接通过安全信道从可信的发布方那里得到一个断言或协议消息,这种方法也不需要数字签名。许多技术可以实现这种直接认证和安全信道的建立,包括TLS/SSL、HMAC以及基于口令的机制等。
推荐在其他所有上下文中对断言和请求响应消息使用数字签名。
以下条款需要特别注意:
---依赖方从SAML发布方以外的实体获得的断言应该经过发布方签名;
---由消息起源方以外的实体发出的消息应该经过消息的起源方签名;
---如果一个概述中未明确声明使用其他的签名机制,任何XML数字签名应使用enveloped形式
所有SAML断言都可以使用XML签名
所有SAML请求响应信息都可以使用XML签名。
2.8.1 XML签名机制
是一个高适应、通用的XML签名机制。SAML配置文件只使用断言和请求响应中直接得到的<ds:Signature>元素,其他配置文件中可以使用自定义方法以获取其他地方出现的签名。
XML签名中包含三种签名和文档的关联方法:enveloping、enveloped和detached。
SAML断言和协议应使用enveloped方式的签名,SAML处理者应该支持rsa-sha1中描述的RSA签名和校验操作。
SAML签名断言和协议消息应为根元素中的ID属性指定值,该根元素可以不是包含该断言或消息的XML文档的根元素。签名应包含一个单独的<ds:Reference>,其中包含根元素中ID属性值的指针。
SAML操作应该在<ds:SignedInfo>中的<ds:CanonicalizationMethod>元素以及<ds:Transform>算法中使用Exclusive Canonicalization。 使用Exclusive Canonicalization能够确保嵌入XML上下文的SAML消息上签名可以被独立识别。
XML签名定义了<ds:KeyInfo>元素的使用,SAML不需要使用<ds:KeyInfo>,也不对其使用作任何限制,因此<ds:KeyInfo>可以忽略。
2.9 SAML和XML加密句法与处理
通常使用某些加密操作来对SAML断言进行保护。
通信机密性可以由具体的绑定和配置文件来提供:
----<subjectConfirmation>的机密性可通过使用<SubjecctConfirmationData>中的<ds:KeyInfo>元素来保护,该元素允许对密钥和其他机密信息进行加密。
----完整的<Assertion>元素可以按照6.4.4(标准中的章节)的要求进行加密;
----<BaseID>和<NameID>元素可以按照6.3.5(标准中的章节)的要求进行加密。
<Attribute>元素可以按照6.8.3.3的要求进行加密
加密信息和密钥应替换XML实例中原有明文信息,EncryptedData的Type属性应该存在,且若存在,应为*****/xmlenc#Element。
2.9.1 签名和加密的组合
XML签名和XML加密可以进行组合,当断言同时被签名和加密时,SP应按照签名和加密操作逆序进行签名验证和解密操作:
----当签名的Assertion被加密时,应在加密之前进行签名;
----当BaseID、NameID和Attribute元素被加密时,应首先执行加密操作然后才能对包含加密元素的消息进行签名。
2.10 SAML扩展性
SAML支持多种途径的扩展,包括扩展断言和协议方案。SAML扩展可以与配置文件的定义相结合,从而发展SAML框架的新用途。
2.11 SAML定义标识符
2.11.1 属性名称标识符
包括三种:未指定、URI指针、基本。
2.11.2 名称标识符
包括:未指定、Email地址、X.509主体名称、Windows域保留名称、Kerberos主体名称、实体标识符(是一个长度不超过1024个字符的URI)、持久标识符、临时标识符。
2.11.2.1 持久标识符(persistent)
就是一个IdP对一个SP(或一个SP组合)的持久不透明的标识符。持久名称标识符由身份提供者生成,它应使用随机假名值构成,且相对主体的实际标识符(如用户名)没有任何可识别的对应性。目的是创建一个非公开的假名来防止主体的身份或活动被发现。持久名字标识符值的长度不得超过256字符。
元素的NameQualifier属性值如果存在,则应包含生成此标识符的身份提供者的唯一的标识符。它可以被省略,如果该值可以由包含元素的消息的上下文衍生出来,例如一个协议消息的发布方,或一个在其主体中包含标识符的断言。注意一个不同的系统实体可能于其后发布它自己的协议消息或包含该标识符的断言;在这种情况下NameQualifier属性不需要改变,但是应继续标识原始创建标识符时所标识的实体(并且在这种情况下不得被省略)。
元素的SPNameQualifier属性如果存在,则应包含一个SP(或一个SP组合)的唯一标识符,此持久标识符是为这个SP(或SP组合)生成的。它可以被省略,如果消息中包含的元素的目的只是为了由SP直接使用,则该值是SP的唯一标识符。
如果SP(或SP组合)最近为实体设置了其他标识符,则该标识符应包含在SPProvidedID属性中。
持久标识符的目的是作为一个隐私保护机制,所以除非提供者已经建立了共享标识符,否则他们不得以明文的形式在提供者间共享。
注意当持久标识符用来反映一对提供者间的账户连接关系时,一个服务提供者没有责任来识别或使用持久标识符的长期有效性质,或者建立这样的链接。
最后,注意NameQualifier与SPNameQUalifier属性指明了创建而不是使用的定向性。如果一个持久标识符由一个特定身份提供者创建,NameQualifier属性值在那一刻即永久性建立了。如果一个收到此标识符的服务提供者作为身份提供者发布自己的断言,其中包含了该标识符,NameQualifier属性值不会变化(也不会被省略)。它可以选择创建自身的持久标识符来代表主体并关联两个值。
2.11.2.2 临时标识符(transient)
指示元素内容是一个有临时语义的标识符,应该被SP作为一个不透明的临时值来处理。临时标识符值应依据SAML标识符的规则生成,且不得超过256字符长度。