前言
SAML协议是一个比较复杂的协议,有很多文章介绍了SAML协议的基础知识,但是如何SAML协议如何实现,如何配置一个SAML的SP服务方,提供一个支持调试的SAML的认证服务(IDP),缺乏一个深入浅出的介绍系统性的介绍。
本博客详细介绍了SAML协议的基础概念,实现,相关的DEMO以及提供调试的IDP。
需要知道的基础概念
首先需要了解几个基本的服务方:
IDP:账号认证的服务方,如赛赋IDaaS作为IDP,主要就是完成认证
SP:向用户提供商业服务的软件(实体),比如禅道
Browser:用户方的浏览器,用户通过浏览器进行资源的访问和相关跳转完成身份的认证
需要知道的几个地址(容易混淆)
“用户登录地址”,应用的SAML协议登录路径
“relayState地址”,应用认证成功后的跳转地址。
“AssertionConsumerServiceUrl”,应用接收统一身份认证平台SAML协议回调接口url
entityId,统一身份认证平台的SAML断言标识的路径,如
http://www.cipherchina.com:7777/cipher/saml/metadata
(其中,赛赋IDaaS的entityId的端口号默认为7777,路径默认为/cipher/saml/metadata,域名或IP为赛赋IDaaS实际部署的服务器IP地址或域名)
统一身份认证平台接收SAML协议请求的回调路径。如
http://www.cipherchina.com:8645/cipher/saml/sso
(其中,回调路径使用的端口号默认为8645,路径默认为/cipher/saml/sso,域名或IP为赛赋IDaaS实际部署的服务器IP地址或域名)
认证的流程
1.用户通过浏览器访问 SP(应用资源) 的某个受保护的资源;
2.SP 鉴别到该用户未鉴权,生成 SAML 认证请求,其中包含应 RelayState地址、IDP的SAML的请求路径
3.SP生成的SAML认请求的数据示例如下:
<?xml version="1.0" encoding="UTF-8"?>
<saml2p:AuthnRequest AssertionConsumerServiceURL="https://saml_sp.app.com/saml/SSO"
Destination="http://www.cipherchina.com:8645/cipher/saml/login" ForceAuthn="false"
ID="a2fae32f725c3fi4469294ghj6d50j0" IsPassive="false" IssueInstant="2019-12-05T06:06:04.141Z"
ProtocolBinding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" Version="2.0"
xmlns:saml2p="urn:oasis:names:tc:SAML:2.0:protocol">
<saml2:Issuer xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion">
https://signin.aliyun.com/1459982555170282/saml/SSO
</saml2:Issuer>
</saml2p:AuthnRequest>
客户端携带 SAML 认证请求,访问IDP的SAML认证服务
http://www.cipherchina.com:8645/cipher/saml/login?SAMLRequest=XXXXXX
其中SAMLRequest后的参数为步骤2中SP生成的SAML认请求数据
4.IDP返回身份认证页面
5.用户使用IDP的身份认证页提交身份认证信息,如用户名密码,扫码等
6.认证通过后,IDP 端生成包含用户身份信息和IDP签名的SAML认证断言
认证断言的示例
7.IDP将包含认证断言的重定向地址发送给客户端浏览器。
8.客户端浏览器进行跳转,携带认证断言,访问 SP的 AssertionConsumerService(ACS) URL
9.SP验证认证断言中IDP的签名合法,根据断言中的用户信息创建session
10.SP返回一个重定向地址给客户端浏览器,打开用户请求的资源页面,如跳转到“relayState地址”
认证流程图:
IDP服务地址赛赋IDaaS
赛赋科技IDaaS提供线上调试的地址,注册后可以快速理解和配置IDP服务。
注册后,添加SAML应用,配置指导
SAML协议的安全设计
在SAML协议中,对协议的安全设计十分完整,包协议中定义的客户端、SP及IDP的交互流程,并且还使用了密码学对SAML中关键的交互数据进行了签名和加密处理。
1.对SAML数据进行签名
为有效的确保SAML的交互过程中的数据不被伪造和篡改,支持对任何SAML数据进行签名。特别是重要的SAML认证断言。
具体的,在本项目中使用了X.509格式的数字证书进行签名,使用了RSA公钥密码算法,SHA-256哈希算法,其密钥长度为1024位。
2.SAML认证断言的安全性设计:加密和断言有效期
在SAML的认证断言中,包含了大量的用户账号信息,因此十分有必要对其进行加密处理。
对SAML认证断言的加密同样支持包括国密算法和AES算法等多种对称加密算法,在本项目中,使用了AES算法,密钥长度为1024位,能够有效的保证SAML认证断言的保密性。
另外,为防止重放攻击,在设计中还对认证断言的有效期进行了限制,认证断言的有效期可配置,建议配置使用较短的有效期。
相关实现
赛赋IDaaS git项目
https://github.com/CipherChina