SAML2.0 协议初识(一)

一、什么是 SAML 协议?

SAML 即安全断言标记语言,英文全称是 Security Assertion Markup Language。它是一个基于 XML 的标准,用于在不同的安全域(security domain)之间交换认证和授权数据。在 SAML 标准定义了身份提供者 (identity provider) 和服务提供者 (service provider),这两者构成了前面所说的不同的安全域。 SAML 是 OASIS 组织安全服务技术委员会(Security Services Technical Committee) 的产品。

SAML(Security Assertion Markup Language)是一个 XML 框架,也就是一组协议,可以用来传输安全声明。比如,两台远程机器之间要通讯,为了保证安全,我们可以采用加密等措施,也可以采用 SAML 来传输,传输的数据以 XML 形式,符合 SAML 规范,这样我们就可以不要求两台机器采用什么样的系统,只要求能理解 SAML 规范即可,显然比传统的方式更好。SAML 规范是一组 Schema 定义。

可以这么说,在 Web Service 领域,schema 就是规范,在 Java 领域,API 就是规范。

二、SAML 协议的作用

  • 认证声明:声明用户是否已经认证,通常用于单点登录。
  • 属性声明:声明某个 Subject 所具有的属性。
  • 授权决策声明:声明某个资源的权限,即一个用户在资源 R 上具有给定的 E 权限而能够执行 A 操作。

三、SAML 相关定义

  • SP(Service Provider): 向用户提供正式商业服务的实体,通常需要认证一个用户的身份;

  • IDP(Identity Provider): 提供用户的身份鉴别,确保用户是其所声明的身份

  • 断言 (Assertions) 即信息:断言是在 SAML 中用来描述认证的对象,其中包括一个用户在什么时间、以什么方式被认证,同时还可以包括一些扩展信息,比如用户的 Email 地址和电话等等。下面是一个断言的例子:

 1 <?xml version="1.0"?>
 2 <saml:Assertion xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema" ID="_d71a3a8e9fcc45c9e9d248ef7049393fc8f04e5f75" Version="2.0" IssueInstant="2014-07-17T01:01:48Z">
 3   <saml:Issuer>http://idp.example.com/metadata.php</saml:Issuer>
 4   <saml:Subject>
 5     <saml:NameID Format="urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress">xiaosy@bw30.com</saml:NameID>
 6     <saml:SubjectConfirmation Method="urn:oasis:names:tc:SAML:2.0:cm:bearer">
 7       <saml:SubjectConfirmationData NotOnOrAfter="2024-01-18T06:21:48Z" Recipient="http://sp.example.com/demo1/index.php?acs" InResponseTo="ONELOGIN_4fee3b046395c4e751011e97f8900b5273d56685"/>
 8     </saml:SubjectConfirmation>
 9   </saml:Subject>
10   <saml:Conditions NotBefore="2014-07-17T01:01:18Z" NotOnOrAfter="2024-01-18T06:21:48Z">
11     <saml:AudienceRestriction>
12       <saml:Audience>http://sp.example.com/demo1/metadata.php</saml:Audience>
13     </saml:AudienceRestriction>
14   </saml:Conditions>
15   <saml:AuthnStatement AuthnInstant="2014-07-17T01:01:48Z" SessionNotOnOrAfter="2024-07-17T09:01:48Z" SessionIndex="_be9967abd904ddcae3c0eb4189adbe3f71e327cf93">
16     <saml:AuthnContext>
17       <saml:AuthnContextClassRef>urn:oasis:names:tc:SAML:2.0:ac:classes:Password</saml:AuthnContextClassRef>
18     </saml:AuthnContext>
19   </saml:AuthnStatement>
20   <saml:AttributeStatement>
21     <saml:Attribute Name="uid" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:basic">
22       <saml:AttributeValue xsi:type="xs:string">test</saml:AttributeValue>
23     </saml:Attribute>
24     <saml:Attribute Name="mail" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:basic">
25       <saml:AttributeValue xsi:type="xs:string">test@example.com</saml:AttributeValue>
26     </saml:Attribute>
27     <saml:Attribute Name="eduPersonAffiliation" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:basic">
28       <saml:AttributeValue xsi:type="xs:string">users</saml:AttributeValue>
29       <saml:AttributeValue xsi:type="xs:string">examplerole1</saml:AttributeValue>
30     </saml:Attribute>
31   </saml:AttributeStatement>
32 </saml:Assertion>

 

  • 协议 (Protocol) 即通信:协议规定如何执行不同的行为。这些行为被细化成一些列的 Request 和 Response 对象,而在这些请求和相应的对象中包含了行为所特别需要的信息。比如,认证请求协议(AuthnRequest Protocol)就规定了一个 SP 如何请求去获得一个被认证的与用户。
    这是一个 AuthnRequest 对象示例:
1 <?xml version="1.0"?>
2 <samlp:AuthnRequest xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol" xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion" ID="ONELOGIN_809707f0030a5d00620c9d9df97f627afe9dcc24" Version="2.0" ProviderName="SP test" IssueInstant="2014-07-16T23:52:45Z" 
Destination
="http://idp.example.com/SSOService.php" ProtocolBinding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" AssertionConsumerServiceURL="http://sp.example.com/demo1/index.php?acs"> 3 <saml:Issuer>http://sp.example.com/demo1/metadata.php</saml:Issuer> 4 </samlp:AuthnRequest>
 
  • 绑定 (Binding) 即传输:绑定定义了 SAML 信息如何使用通信协议被传输的。比如,HTTP 重定向绑定,即声明 SAML 信息将通过 HTTP 重定向消息传输;再比如 SAML SOAP 绑定,声明了通过 SOAP 来传递 SAML 消息。比如上面 AuthnRequest 就声明了 Http-POst 绑定

  • 元数据 (MetaData):SAML 的元数据是配置数据,其包含关于 SAML 通信各方的信息,比如通信另一方的 ID、Web Service 的 IP 地址、所支持的绑定类型以及通信中实用的密钥等等。

四、SAML 协议流程分析:

SAML 协议内容比较复杂,绑定方式不只一个,在这里我们以应该算是最简单的一种绑定方式 HTTP-POST 方式说明 SAML 协议的工作流程(好吧,其实是其他的还没有了解呢 sweat<em>smile

7eca932fd80b4dc5af08af22a7eb934a_TIM20171220164630.png

1、用户通过浏览器访问 SP 的某个受保护的资源
2、SP 鉴别到该用户未鉴权,于是将该用户重定向到 IDP 端;前提是改 IDP 是受 SP 信任的身份认证中心;
3、IDP 端通过自己的认证方式对该用户合法性进行认证;
4、认证通过后,IDP 端生成响应后返回给 SP
5、SP 接收到 IDP 的响应后解析出用户认证信息,合法,则允许用户访问受保护的资源

接下来,我将分别从 SP 端和 IDP 端对一些常用的参数进行介绍,并且最后给出一个简单的 demo, 敬请期待 smile

posted @ 2017-12-21 14:43  浅夏丶未央  阅读(26641)  评论(1编辑  收藏  举报