分类: 信息化
2018-07-11 17:47:56
本文主要如何基于SAML协议认证去接入单点登录系统,实现单点登录。
本文转自IT培训机构-学领未来
SAML即安全断言标记语言,英文全称是Security Assertion Markup Language。它是一个基于XML的标准,用于在不同的安全域(security domain)之间交换认证和授权数据。在SAML标准定义了身份提供者(identity provider)和服务提供者(service provider),这两者构成了前面所说的不同的安全域。 SAML是OASIS组织安全服务技术委员会(Security Services Technical Committee)的产品。
简而言之,SAML是一个XML框架,可以用来传输安全声明。在两台机器机器进行通讯的时候,我们可以采用加密等方式,同样也可以用SAML来传输,只要符合SAML规范,能够正确解析生成的XML我们就可以拿到我们想要的身份信息。
SP服务提供者(Service Provider):用户实际提供正式服务的实体,需要认证一个用户的身份。
IDP身份提供者(Identity Provider):提供用户身份的实体,确保用户是其所声明的身份。
断言(Assertions):断言即是在SAML中描述认证的对象包括了一些基础信息,时间、方式认证或者其他扩展信息等。
元数据(MetaData):元数据就是配置数据,包含了关于SAML通信的各方的信息,如通信一方的ID,服务地址,绑定类型等。
SAML发起单点登录流程主要分为了两类,一类是由IDP身份提供者进行发起,最终跳转到对应系统,第二类则是由SP服务提供者发起,SP服务提供者检测是否有身份信息,若没有跳转到IDP上进行登录,登录后再跳回对应SP服务提供者系统,完成单点登录。以下是两类流程的流程图:
IDP发起单点登录的流程:
1. 检查用户是否已经登录
2. 用户登录IDP
3. 选择远程受保护的资源调用SSO服务
4. 生成一个SAML Response XML文档并POST转发到SP服务提供者
5. 服务提供者接受到请求后解析收到的Response信息
6. 若能正确解析则请求对应的资源
SP发起单点登录的流程:
SP和IDP单点登录的流程基本一致,只是发起方从IDP发起变成了SP发起,
1. SP请求资源
2. 发现没有身份信息,发送SAML Request请求给到IDP
3. IDP接受到request请求验证是否是信任的应用,后面几部则和IDP登录是一致的
SAML响应由单点登录门户构建,并通过HTTPPOST方法发送到对应SP,以下是一个SAML响应的解析样例:
a) 构建一个SAML响应例如
Qr+zJCQH8O/S+sDgCEUhXG+PFU4j2pxnnYqwI3jKc2yeT7A7f8ShStgwN7IgjZ0TFLx2TO3tlZ76
2GwFHNN0lH9ohtAv8Zs=
A1UECBMHYmVpamluZzEQMA4GA1UEBxMHYmVpamluZzERMA8GA1UEChMIYmV3aW5uZXIxDTALBgNV
BAsTBGJ3MzAxDzANBgNVBAMTBnhpYW9zeTAeFw0xNzExMDgwOTU1NDVaFw0yNzExMDYwOTU1NDVa
MGcxDjAMBgNVBAYTBWNoaW5hMRAwDgYDVQQIEwdiZWlqaW5nMRAwDgYDVQQHEwdiZWlqaW5nMREw
DwYDVQQKEwhiZXdpbm5lcjENMAsGA1UECxMEYnczMDEPMA0GA1UEAxMGeGlhb3N5MIGfMA0GCSqG
SIb3DQEBAQUAA4GNADCBiQKBgQCgmrEMgAMY7zygYqBtYzMal0vTVsQNyjGkD3tbA+pEk18YfN13
UEBoqrp/XQiR4v334xqHjdtG8lxDzEUJ4fQippxMpw6Fab45pz6uOr33DI6X3IwLPxtb7q1MyIj3
TXBY6R01rwIaE+G8/5z76mN5qq4/lhoY3bs0D06pwUSSSQIDAQABoyEwHzAdBgNVHQ4EFgQURAyK
5AjoSEOk32ceEloftZ8TiWcwDQYJKoZIhvcNAQELBQADgYEAZuNWxMO8HOItqAoCI8f6+PfjbL/7
xTwDjs8PxnermmVjACx5JiW0O98M0D5Guo0OABf8mMxiDYQvRwpNoEfMOXr3TjPxqioLMq+s1Nt8
0Duilqel+O6Q/XDJ8rlVdm8vPhLxWZ14FIdI8n7CuuUwUExe4Uj05shCMwgNRo6bmaU=
上文看似很复杂,但实际我们只需要掌握以下节点即可:
1. samlp:Response 根节点,表明这是一个 response 对象;
2. samlp:Status 认证结果, samlp:StatusCode 表明认证成功或失败;
3. saml:Assertion 断言,这是 Response 中最为重要的字段,里面包含着用户身份信息;
4. Signature 断言的签名,使用私钥对 Assertion 内容(不包含 Signature)进行签名,防止信息被篡改;
5. saml:Subject 身份主体,主要包括身份信息;
6. saml:NameID 身份信息;
7. saml:Conditions 给出了断言被认为有效的验证条件;
8. saml:AuthnStatement 描述了在身份提供者的认证行为。
b) 对于该SAML响应,使用IDP提供的公钥对Signature进行签名校验如果通过,则解析samlp:Status的值,若该值为“
c) 若认证通过,则解析”saml:NameID”获取登录名,由应用系统处理后续用户登录到对应系统中。
图示如下:
SAML请求由SP构建,并通过HTTPPOST方法发送到IDP平台以下是一个SAML 请求构建步骤的样例:
a) 构建明文SAML请求,例如:
ID="3983b844-5f42-4c66-b476-f69704f00b5b" IssueInstant="2017-12-21T08:35:56.975Z" ProtocolBinding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" Version="2.0">
该请求根节点是
1. AssertionConsumerServiceURL 断言消费服务地址,即当 IDP 认证成功后响应返回的地址(此URL必须在单点门户中心注册,否则无法通过认证);
2. ID 该请求的唯一标识;
3. IssueInstant 请求的时间;
4. ProtocolBinding SP 声明此次通信的绑定方式,不同的绑定方式意味着不同的通信流程,SAML2.0 主要包括:HTTP-Artifact,HTTP-POST,HTTP-Redirect,SOAP 等几种绑定方式;
5. Version 版本号;
6. saml:Issuer SP 的 Id 标识。
b) 将XML字符串进行base64编码后,构建HTTP POST请求,并发送到单点登录门户,其中该POST请求中需要带两个参数,分别为:
SAMLRequest(xml进行base64编码后的字符串),RelayState(中继状态,即用户原始访问URL,该参数会被单点登录门户返回,以使应用识别并返回原始访问地址)。