Chinaunix首页 | 论坛 | 博客
  • 博客访问: 507287
  • 博文数量: 158
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 904
  • 用 户 组: 普通用户
  • 注册时间: 2016-10-10 11:17
文章分类

全部博文(158)

文章存档

2018年(74)

2017年(84)

我的朋友

分类: 信息化

2018-07-11 17:47:56

    本文主要如何基于SAML协议认证去接入单点登录系统,实现单点登录。

   本文转自IT培训机构-学领未来

一、      什么是SAML协议

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

       简而言之,SAML是一个XML框架,可以用来传输安全声明。在两台机器机器进行通讯的时候,我们可以采用加密等方式,同样也可以用SAML来传输,只要符合SAML规范,能够正确解析生成的XML我们就可以拿到我们想要的身份信息。

二、      SAML相关定义

SP服务提供者(Service Provider):用户实际提供正式服务的实体,需要认证一个用户的身份。

IDP身份提供者(Identity Provider):提供用户身份的实体,确保用户是其所声明的身份。

断言(Assertions):断言即是在SAML中描述认证的对象包括了一些基础信息,时间、方式认证或者其他扩展信息等。

元数据(MetaData):元数据就是配置数据,包含了关于SAML通信的各方的信息,如通信一方的ID,服务地址,绑定类型等。

三、      SAML发起认证流程分析

SAML发起单点登录流程主要分为了两类,一类是由IDP身份提供者进行发起,最终跳转到对应系统,第二类则是由SP服务提供者发起,SP服务提供者检测是否有身份信息,若没有跳转到IDP上进行登录,登录后再跳回对应SP服务提供者系统,完成单点登录。以下是两类流程的流程图:

IDP发起单点登录的流程:

                                              image001.jpg

1. 检查用户是否已经登录

2. 用户登录IDP

3. 选择远程受保护的资源调用SSO服务

4. 生成一个SAML Response XML文档并POST转发到SP服务提供者

5. 服务提供者接受到请求后解析收到的Response信息

6. 若能正确解析则请求对应的资源

SP发起单点登录的流程:

image002.jpg

       SP和IDP单点登录的流程基本一致,只是发起方从IDP发起变成了SP发起,

1.      SP请求资源

2.      发现没有身份信息,发送SAML Request请求给到IDP

3.      IDP接受到request请求验证是否是信任的应用,后面几部则和IDP登录是一致的

四、      请求响应规范

SAML响应由单点登录门户构建,并通过HTTPPOST方法发送到对应SP,以下是一个SAML响应的解析样例:

a)     构建一个SAML响应例如

 

 

   

 

 

    k9i4QGA5BDFkW5I+Igr8hR1ibZs=PLIKGZOFbMt8qEM1yw6f/Uct7R9Xd8KWZXw5925gIJdA8+q9MfY34+sQwDcy1Tqnxzak6hx6A6ol

Qr+zJCQH8O/S+sDgCEUhXG+PFU4j2pxnnYqwI3jKc2yeT7A7f8ShStgwN7IgjZ0TFLx2TO3tlZ76

2GwFHNN0lH9ohtAv8Zs=MIICaDCCAdGgAaIBAgIEfnIVCzANBgkqhkiG9w0BAQsFADBnMQ4wDAYDVQQGEwVjaGluYTEQMA4G

A1UECBMHYmVpamluZzEQMA4GA1UEBxMHYmVpamluZzERMA8GA1UEChMIYmV3aW5uZXIxDTALBgNV

BAsTBGJ3MzAxDzANBgNVBAMTBnhpYW9zeTAeFw0xNzExMDgwOTU1NDVaFw0yNzExMDYwOTU1NDVa

MGcxDjAMBgNVBAYTBWNoaW5hMRAwDgYDVQQIEwdiZWlqaW5nMRAwDgYDVQQHEwdiZWlqaW5nMREw

DwYDVQQKEwhiZXdpbm5lcjENMAsGA1UECxMEYnczMDEPMA0GA1UEAxMGeGlhb3N5MIGfMA0GCSqG

SIb3DQEBAQUAA4GNADCBiQKBgQCgmrEMgAMY7zygYqBtYzMal0vTVsQNyjGkD3tbA+pEk18YfN13

UEBoqrp/XQiR4v334xqHjdtG8lxDzEUJ4fQippxMpw6Fab45pz6uOr33DI6X3IwLPxtb7q1MyIj3

TXBY6R01rwIaE+G8/5z76mN5qq4/lhoY3bs0D06pwUSSSQIDAQABoyEwHzAdBgNVHQ4EFgQURAyK

5AjoSEOk32ceEloftZ8TiWcwDQYJKoZIhvcNAQELBQADgYEAZuNWxMO8HOItqAoCI8f6+PfjbL/7

xTwDjs8PxnermmVjACx5JiW0O98M0D5Guo0OABf8mMxiDYQvRwpNoEfMOXr3TjPxqioLMq+s1Nt8

0Duilqel+O6Q/XDJ8rlVdm8vPhLxWZ14FIdI8n7CuuUwUExe4Uj05shCMwgNRo6bmaU=

   

      test@qq.com

     

       

     

   

   

     

       

     

   

   

     

 urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport

     

    

 

上文看似很复杂,但实际我们只需要掌握以下节点即可:

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”获取登录名,由应用系统处理后续用户登录到对应系统中。

图示如下:

image003.jpg

      

       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,该参数会被单点登录门户返回,以使应用识别并返回原始访问地址)。

阅读(2420) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~