SAML概述
SAML(Security Assertion Markup Language 安全断言标记语言)是一个基于XML的开源标准数据格式,为在安全域间交换身份认证和授权数据,尤其是在IDP(Identity Provider身份提供方)和SP(Service Provider 服务提供方)之间。SAML是OASIS(Organization for the Advancement of Structured Information Standards 安全服务技术委员会)制定的标准,始于2001年,其最新主要版本SAML 2.0于2005年发布。SAML解决的最主要的需求是基于Web的单点登录(SSO)。
SAML出现早,内容比较全,应用很广泛,但是缺点也比较明显。首先SAML只支持Web的SSO,不支持移动端;其次内容太广,如果要做一个比较全的SAML,需要实现协议中规定的所有项目,包括大量的可选项目,工程量比较大;再次SAML是基于XML的协议,这样又需要基于更多的协议进行开发。
SAML协议中定义了三种角色:
User Agent:用户代理,一般指自然人用户通过浏览器进行服务访问或者向其他服务提供者请求资源的的系统主体;
IDP(Identity Provider):一种服务提供者,它创建、维护和管理主体的身份信息,并向联邦内的其他服务提供者提供主体身份验证;
SP(Service Provider):一种服务提供者,通过解析IDP发出的身份认证断言,验证主体身份认证信息后,给主体或联邦内其他系统提供服务。
Metadata
SAML协议规定,要让IDP和SP实现SSO,需要在IDP和SP进行参数配置,主要是交换IDP和SP的Metadata(元数据)信息,IDP的Metadata示例如下:
<md:EntityDescriptor entityID="https://idp.example.org/SAML2" validUntil="2013-03-22T23:00:00Z" xmlns:md="urn:oasis:names:tc:SAML:2.0:metadata" xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion" xmlns:ds="http://www.w3.org/2000/09/xmldsig#"> <!-- insert ds:Signature element (omitted) --> <!-- insert md:IDPSSODescriptor element (below) --> <md:Organization> <md:OrganizationName xml:lang="en">Some Non-profit Organization of New York</md:OrganizationName> <md:OrganizationDisplayName xml:lang="en">Some Non-profit Organization</md:OrganizationDisplayName> <md:OrganizationURL xml:lang="en">https://www.example.org/</md:OrganizationURL> </md:Organization> <md:ContactPerson contactType="technical"> <md:SurName>SAML Technical Support</md:SurName> <md:EmailAddress>mailto:saml-support@example.org</md:EmailAddress> </md:ContactPerson> </md:EntityDescriptor>
主要元素信息为:
标签 |
说明 |
<md:EntityDescriptor>下的entityID |
IDP的唯一标识。 |
<md:EntityDescriptor>下的validUntil |
元数据的过期时间。 |
<ds:Signature> |
包含数字签名,以确保元数据的真实性和完整性。 |
<md:Organization> |
组织信息。 |
<md:ContactPerson> |
联系人信息。 |
IDP的SSO相关Metadata是<md:IDPSSODescriptor>元素,示例如下:
<md:IDPSSODescriptor protocolSupportEnumeration="urn:oasis:names:tc:SAML:2.0:protocol"> <md:KeyDescriptor use="signing"> <ds:KeyInfo>...</ds:KeyInfo> </md:KeyDes