SAML2协议的讲解与应用

一、简介

**SAML(Security Assertion Markup Language)**安全断言标记语言,是一个基于XML的、用于实现不同业务实体(即系统或服务)之间,交换安全信息(例如认证信息、授权信息、主体属性信息等)的标准协议。SAML协议是由OASIS组织最早在2002年被提出,已经经历了1.0、1.1、2.0三个版本。

二、两个主体

  •   在Web Browser SSO场景中,SAML协议定义了两个角色:
    
    • **Service Provider**:简称SP,服务提供方,通常是指那些具备专项功能的业务系统,比如OA办公系统,邮件系统,ERP系统等;
      
    • **Identiry Provider**:简称IdP,身份提供方,一般是IAM、IDaaS这类能够提供身份管理、身份认证能力的应用或服务;Authing 可以作为身份提供方,身份提供方能够向 SP 发送身份断言,所谓身份断言就是由 Authing 签发的,可以标识某个人身份的 Token,只不过,在 SAML 协议中,这个 Token 的格式是 XML 形式的。还有一些其他的身份提供方,例如 Okta、SSOCircle、Auth0,他们都可以向 SP 返回身份断言。
      
    • SP 提供服务,需要知道用户的身份,就需要向 IdP 询问。IdP 知道用户的身份,当用户在 IdP 登录成功,IdP 就将用户的身份以 SAML 断言的形式发给 SP。SP 信任 IdP 发来的身份断言,从而赋予该用户在 SP 的相关权限。
      

三、SAML Request与SAML Response

1.SAMLRequest

  • 当用户的身份无法鉴定时,SP 会向 IdP 发送 SAML Request 信息(通过浏览器发送),请求 IdP 来鉴定用户身份。
    在这里插入图片描述

2.SAMLResponse

  • IdP 收到 SAML Request 后,会对用户身份进行认证:当用户在 IdP 完成登录后,SAML IdP 将用户身份断言发送给 SP(放在表单中,通过浏览器 POST 请求发送)。SAML IdP 的响应内容如下:

在这里插入图片描述

四、SAML2 流程

1.一个形象的例子

  • 假设有一个 Peter(Subject) 的法国公民,他需要访问比利时 (Service Provider) ,他在比利时机场被要求提供身份信息, Peter 提供了欧盟 (Federation) 的通行证件,随即,这个通行证件在比利时机场被审核,或通过计算机送到欧盟身份认证中心 (Identity Provider) ,该中心有一个由所有欧盟国家共同建立的公民数据库,中心审核了 Peter 的身份信息,并断言“ Yes , He is Peter From France ”,于是, Peter 得到礼貌的回应“欢迎光临比利时”。

###2.流程
在这里插入图片描述

  • 1) 用户想要访问WebApp1网站上的资源,但是该用户并没有sp网站上的合法的登录态。
    
  • 2)于是,SP发送了一个重定向消息给浏览器。重定向消息的HTTP报文头中包含了IDP登录服务的URI地址,同时还有一个被称为SAMLRequest的请求参数。浏览器处理该重定向请求:发起一个GET请求到IDP登录地址并将SAMLRequest作为请求参数。
    
  • 3)IDP的登录服务要求用户提供身份凭证。
    
  • 4)用户输入自己的身份凭证。
    
  • 5)IDP在验证了用户的身份凭证是合法的之后,其单点登录服务发送一个HTML表单给浏览器。HTML表单中包含了SAML响应,该响应中是一个SAML断言。SAML规范要求SAML断言必须被签名。
    
  • 6) 浏览器收到SAML响应之后,会将该请求转发到SP的Assertion Consumer Service。
    
  • 7)SP的Assertion Consumer Service验证SAML响应中数字签名的合法性。如果验证通过,它会返回目标资源。
    

五、SAML协议中的基本概念

在整个SAML协议框架体系中,会涉及到以下几个基本概念:Assertions、Protocols、Bindings、Profiles、Metadata。

1.Assertions

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

在这里插入图片描述

在这里插入图片描述

  •     DigestValue:摘要
    
  •     SignatureValue:签名
    
  •     AuthnStatement:认证状态(是否成功)
    
  •     Issuer 颁发者是谁  可以根据这个属性找到对应公钥。
    
  •     Audience:颁发给谁
    
  •     Conditions:断言在什么时间内有效
    
  •     nameId: 比如Emai/姓名/手机号,与sp中的Role进行映射
    
  •     AttributeValue:当前主体的属性 如displayName,uid等
    

2.Protocols

  • 消息协议,可以简单的理解为SAML报文格式,即两个不同系统之间在通过SAML协议进行交互时,请求和响应报文的具体规范。
  • 协议规定如何执行不同的行为。这些行为被细化成一些列的Request和Response对象,而在这些请求和相应的对象中包含了行为所特别需要的信息。比如,认证请求协议(AuthnRequest Protocol)就规定了一个SP如何请求去获得一个被认证的与用户。

3.Bindings

  • 用于定义SAML消息报文如何通过底层传输协议进行传输,例如:支持通过哪些协议进行传输?通过这些协议进行传输时,应该将请求\响应报文放在协议的什么位置、哪些参数中?SAML2.0中,定义了六种Bidings,在(六、SP 与 IdP 之间通信方式)中介绍了其中三种。

4.Profiles

  • Profiles 定义了具体的业务场景的交互流程和约束,通过将Assertions、Protocols、Bindings的有机组合,实现具体用例场景需求目标。SAML2.0中,定义8个场景,其中最常用的就是以下两个场景:
  • Web Browser SSO Profile: 定义了业务系统之间如何利用Web浏览器, 通过HTTP Redirect Biding、HTTP POST Binding、HTTP Artifact Binding三种方式,实现认证请求、SAML响应和断言的发送与接收,最终实现单点登录。
  • Single Logout Profile: 定义了业务系统之间如何利用Web浏览器, 通过HTTP Redirect Biding、HTTP POST Binding、HTTP Artifact Binding三种方式,实现退出请求及响应的发送与接收,最终实现单点登出。

5.Metadata

  • Metadata 定义了SAML协议参与者之间描述、共享配置信息的规范。以Web单点登录场景为例,Metadata里可以声明当前系统的以下信息:当前系统的标识信息、支持扮演的角色(IDP或SP或二者兼备)、支持的签名方式以及签名私钥对应的X.509证书、支持的主体标识格式以及主体的属性、支持的SAML Bindings等;如果当前系统扮演的是IDP角色,还可以包含单点登录发起的URL地址等;如果当前系统扮演的是SP角色,还可以包含断言消费地址等
    在这里插入图片描述

6.结构图

在这里插入图片描述

六、SP 与 IdP 之间通信方式

SP 与 IdP 之间的通信方式分为 HTTP Redirect Binding、HTTP POST Binding、HTTP Artifact Binding。每种方式在不同的阶段会用不同类型的 HTTP 与对方通信。

1.HTTP Redirect Binding

SP 通过重定向 GET 请求把 SAML Request 发送到 IdP,IdP 通过立即提交的 Form 表单以 POST 请求的方式将 SAML Response 发到 SP。
在这里插入图片描述

2.HTTP POST Binding

SP 通过立即提交的 Form 表单以 POST 请求的方式将 SAML Request 发到 IdP。IdP 通过立即提交的 Form 表单以 POST 请求的方式将 SAML Response 发到 SP。
在这里插入图片描述

3.HTTP Artifact Binding

SP、IdP 双方只通过浏览器交换 SAML Request、SAML Response 的索引编号,收到编号后,在后端请求对方的 Artifact Resolution Service 接口来获取真正的请求实体内容。从而避免 SAML Request、SAML Response 暴露在前端。
在这里插入图片描述

七、认证与UserID映射

在这里插入图片描述

  • 用户为什么可以访问SP上的资源(nameId来确定), idp中肯定没有sp 的账号,需要设计一个映射关系 ,再提取sp的用户权限 用户名可以不一样,但必须有一个东西要映射起来。ipd中认证过了发一个断言,sp中就会有相应的权限。

八、安全设计

1.非对称加密简述

  • 密钥对:在非对称加密技术中,有两种密钥,分为私钥和公钥,私钥是密钥对所有者持有,不可公布,公钥是密钥对持有者公布给他人的。
  • 公钥:公钥用来给数据加密,用公钥加密的数据只能使用私钥解密
  • 私钥:如上,用来解密公钥加密的数据。-
  • 摘要:对需要传输的文本,做一个HASH计算,一般采用SHA1,SHA2来获得
  • 签名:使用私钥对需要传输文本的摘要(需要传输的文本的hash运算)进行加密,得到本次传输过程的签名。
  • 签名验证:数据接收端,拿到传输文本,但是需要确认该文本是否就是发送发出的内容,中途是否曾经被篡改。因此拿自己持有的公钥对签名进行解密(密钥对中的一种密钥加密的数据必定能使用另一种密钥解密。),得到了文本的摘要,然后使用与发送方同样的HASH算法计算摘要值,再与解密得到的摘要做对比,发现二者完全一致,则说明文本没有被篡改过。
  • 证书(公钥证书):认证中心用自己的私钥对别人的公钥+其它信息作加密,生成数字证书。认证中心会留一个公钥给用户a, 用户a发送签名+证书一起给用户b发消息。用户b用认证中心的公钥解开数字证书,就可以拿到一定没被篡改过的用户a的公钥了。再去签名进行验签,即可验证确实是用户a发出的
    (详见https://zhuanlan.zhihu.com/p/134349361)

2.如何保证收到的断言可以信任

  • IDP有自己的私钥以及对应的公钥证书,SP也有自己的私钥以及对应的公钥证书。在SAML协议运转之前,IDP和SP提前交换自己的Metadata(其中包含对方的公钥证书),这个过程通常是由企业的IT管理员配置完成。由于企业IT管理员是可被信任的,所以IDP和SP分别的公钥也被认为是可以被信任的,因此公钥证书可以不再由权威机构颁发,而是由企业IT管理员自己进行签发,这种证书被叫做自签名证书
    在这里插入图片描述

  • 断言中包括颁发者,当前用户等信息,sp会根据断言找到idp的公钥,对断言中的签名进行验签,来保证传输的信息没有被修改

九、整合OpenSAML到SpringBoot项目

详见:
1.https://www.jianshu.com/p/d041935641b4 OpenSAML 使用引导
2.https://yizhenn.gitbook.io/saml 把SAML协议核心文档
3.https://github.com/sunrongxin7666/OpenSAML-ref-project-demo-v3.git OpenSAML-ref-project-demo-v3项目地址

  • 21
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值