Saml协议解析 - littleboy12580/learning_python GitHub Wiki

SAML协议概念

SAML(Security Assertion Markup Language)即安全断言标记语言,它是一个基于XML的标准,用于在不同的安全域(security domain)之间交换认证和授权数据;在SAML标准定义了身份提供者(identity provider)(断言的产生者)和服务提供者(service provider)(断言消费者),这两者构成了前面所说的不同的安全域;

SAML作用

SAML 主要包括三个方面:
1 .认证申明。表明用户是否已经认证,通常用于单点登录 2 .属性申明。表明 某个Subject 的属性 3 .授权申明。表明 某个资源的权限

SAML结构

SAML协议的基本组成结构如下图所示:
saml-concepts

Assertion断言

规定了断言的xml结构,即这个assertion节点到底该怎么写, 其实就是这个节点的schema;SAML断言一个重要的类型被称为“bearer”断言,它被用于帮助Web浏览器的SSO;下面是一个很短活跃周期的bearer断言,他是由身份提供者(https://idp.example.org/SAML2)发布给服务提供方(https://sp.example.com/SAML2)的;断言中包含saml:AuthnStatementsaml:AttributeStatement,假设该断言是服务提供方用来做访问控制决定的

<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>  

saml:Assertion元素包含如下的子元素:

  • saml:Issuer元素,包含了身份提供者的唯一身份。
  • ds:Signature元素,包含了在saml:Assertion元素中完整保存的数字签名.
  • saml:Subject元素,定义了认证过的主体,但是在该实例中,因为保密的原因,主体身份被隐藏在透明的transient标识之后。
  • saml:Conditions元素,给出了断言被认为有效的验证条件。
  • saml:AuthnStatement元素,描述了在身份提供者的认证行为。
  • saml:AttributeStatement元素,声明了认证主体相关的多值属性。

通俗的说,断言被编码成如下信息:
在时间为"2004-12-05T09:22:05Z"时,身份提供者(https://idp.example.org/SAML2)唯一发布了关于主体(3f7b3dcf-1674-4ecd-92c8-1544f346baf8)的断言("b07b804c-7c29-ea16-7300-4f3d6f7928ac"),发送给服务提供方(https://sp.example.cin/SAML2)。 认证声明说明如下信息:包含在saml:subject中的认证过的主体元素,在时间“2004-12-05T09:22:00Z”被认证,也就是说密码通过受保护的通道被发送过来。
同样,属性声明陈述为:在saml:Subject元素中的被验证的主体在一个机构中的工作人员

Protocols协议

它规定了如何请求(samlrequest)和回复(samlresponse )saml消息,其中当然包含assertion的消息;
Protocols中有如下的几个核心协议:

  1. 断言查询和请求协议(Assertion Query and Request Protocol)
    定义了断言可能拥有的一系列查询,该协议的请求形式可以通过引用一个断言ID来向一个断言提供方请求已经存在的对应的断言;协议的查询形式则定义了一个依赖方如何在特定的主体和所需的语句类型的基础上来请求断言
  2. 认证请求协议(Authentication Request Protocol)
    定义了一个主体(或者主体的代理)是如何来请求一个包含认证信息以及可选的属性信息的断言的机制
  3. 组件解决协议(Artifact Resolution Protocol)
    SAML消息通过值 或者 值引用 从一个实体传到另一个实体。对SAML消息的引用被成为artifact。Artifact的接受者,通过直接发送samlp:ArtifactResolve请求到artifact的发布者 来处理引用,然后发布者响应由artifact引用的真实的消息
  4. 命名身份管理协议(Name Identifier Management Protocol)
    提供了修改一个主体的名称标识的内容或形式的机制,同时也提供了终止身份提供者(IDP)与服务提供者(SP)的名称标识对应连接关系的机制
  5. 单点退出协议(Single Logout Protocol)
    定义了一个机制,允许几乎同时注销与主体相关的活动会话。注销可以直接由用户发起的,也可能由于会话过期或者管理员命令而被IDP或SP初始化
  6. 命名身份映射协议(Name Identifier Mapping Protocol)
    提供了一种机制以编程方式将一个SAML的名字标识符通过适当的策略映射到另一个主体;例如,在一个应用集成方案中它允许一个SP向一个IDP请求某个用户的标识,SP可以在另一个SP中使用该标识

Bindings绑定

绑定说明了saml消息是如何发出的,即用什么协议来承载这些smal消息的;最常用的协议是http或者soap,以下是SAML 2.0支持的绑定:

  • SAML SOAP 绑定(基于SOAP1.1)
    定义了如何基于SOAP1.1,在HTTP上使用SOAP来传输SAML消息
  • 反SOAP绑定(PAOS)
    定义了一个多级SOAP/HTTP消息交换允许HTTP客户端是一个SOAP应答。用于增强客户端和代理配置使客户与代理能够协助进行IDP发现
  • HTTP重定向绑定(GET)
    定义了如何使用HTTP重定向消息传输SAML消息
  • HTTP POST绑定
    定义了如何使用HTML的表单控件的64位编码内容来传输SAML消息
  • HTTP Artifact 绑定
    使用Artifact Resolution Protocol和HTTP之上的SOAP绑定根据引用来处理SAML消息
  • SAML URI绑定
    定义了如何通过解析URI来检索对应的SAML断言

Profiles配置

规定了某些场景下一整套saml认证的细节和步骤,即断言,协议,绑定是如何结合的; 例如它规定了比较著名的SSO方案。,就是如何用saml实现sso的一整套配置和详细步骤;以下是SAML 2.0定义的配置:

  • Web Browser SSO Profile
    定义了一个SAML实体如何使用认证请求协议与SAML响应消息以及断言来实现标准浏览器的单点登录;它定义了消息是如何HTTP重定向,HTTP POST,以及HTTP Artifact绑定结合使用的的
  • Enhanced Client and Proxy (ECP) Profile
    定义了一个特殊的SSO配置,在该配置中客户端和网关代理使用SOAP绑定与反SOAP绑定
  • Identity Provider Discovery Profile
    为SP提供了一种可能的机制,使得SP可以了解用户以前访问过的IDP信息
  • Single Logout Profile
    定义了SAML单点注销协议如何结合SOAP,HTTP Redirect,HTTP POST, 以及HTTP Artifact绑定来使用
  • Assertion Query/Request Profile
    定义了SAML实体如何使用SAML查询和请求协议来在一个同步绑定协议(例如SOAP)上获取SAML断言
  • Artifact Resolution Profile
    定义了SAML实体如何使用Artifact解决协议来在一个同步绑定协议(例如SOAP)上通过一个artifact的引用来获取协议信息
  • Name Identifier Management Profile
    定义了命名身份管理协议如何结合SOAP,HTTP Redirect,HTTP POST, 以及HTTP Artifact绑定来使用
  • Name Identifier Mapping Profile
    定义了命名身份映射协议是如何使用同步绑定(例如SOAP)的