上一节,我们初步认识了 SAML 协议的概念和工作流程,这一节将介绍 SP 端的一些细节。

通常情况下,SP 端是请求发起端,即当用户访问 SP 端的受保护资源时,由 SP 端向认证中心(IDP 端)发起认证请求。最终请求会回到 SP 端并由 SP 端将受保护资源授权给用户。

假设,SP 有一受保护静态资源 index.html,通常情况下,为了保护该静态资源,SP 可以选择用过滤器对访问该资源的请求进行过滤,如果该用户已被授权,则将 index.html 返回给用户;否则将生成认证请求到 IDP。

首先,我们先看一个有 SP 端生成的认证请求参数,它是普通的 xml 文档:

  1. <?xml version="1.0" encoding="UTF-8" standalone="no"?>
  2. <samlp:AuthnRequest xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol" AssertionConsumerServiceURL="http://localhost:8080/sp/consumer" Destination="http://localhost:8080/idp/sso"
    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">
  3. <saml:Issuer xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion">http://localhost:8080/sp</saml:Issuer>
  4. <samlp:NameIDPolicy AllowCreate="true" Format="urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified"/>
  5. </samlp:AuthnRequest>

该请求根节点是 <samlp:AuthnRequest> 来表明是一个认证请求,有如下几个参数:

1、 AssertionConsumerServiceURL 断言消费服务地址,即当 IDP 认证成功后响应返回的地址
2、 Destination 目标地址,即 IDP 接收请求的地址
3、 ID 该请求的唯一标识
4、 IssueInstant 请求的时间
5、 ProtocolBinding SP 声明此次通信的绑定方式,不同的绑定方式意味着不同的通信流程,SAML2.0 主要包括:HTTP-Artifact,HTTP-POST,HTTP-Redirect,SOAP 等几种绑定方式。
6、 Version 版本号
7、 saml:Issuer SP 的 Id 标识
8、 samlp:NameIDPolicy IDP 对于用户身份的标识;NameID policy 是 SP 关于 NameID 是如何被创建的说明;Format 指明 SP 需要返回什么类型的标识(SAML Artifact);属性AllowCreate指明 IDP 是否被允许当发现用户不存在时创建用户账号。

创建 AuthnRequest 对象采用了开源的 opensaml,代码如下:

  1. /**
  2. * 创建AutheRequest对象 * @param idpSsoUrl
  3. * @param acsUrl
  4. * @param spEntityId
  5. * @return
  6. */
  7. public AuthnRequest createRequest(String idpSsoUrl,String acsUrl,String spEntityId){
  8. AuthnRequest authnRequest = create(AuthnRequest.class,AuthnRequest.DEFAULT_ELEMENT_NAME);
  9. authnRequest.setIssueInstant(new DateTime());
  10. authnRequest.setDestination(idpSsoUrl);
  11. authnRequest.setProtocolBinding(SAMLConstants.SAML2_POST_BINDING_URI);
  12. authnRequest.setID(UUID.randomUUID().toString());
  13. authnRequest.setAssertionConsumerServiceURL(acsUrl);
  14.  
  15. Issuer issuer = create(Issuer.class,Issuer.DEFAULT_ELEMENT_NAME);
  16. issuer.setValue(spEntityId);
  17. authnRequest.setIssuer(issuer);
  18.  
  19. NameIDPolicy nameIDPolicy = create(NameIDPolicy.class,NameIDPolicy.DEFAULT_ELEMENT_NAME);
  20. nameIDPolicy.setAllowCreate(true);
  21. nameIDPolicy.setFormat(NameID.UNSPECIFIED);
  22. authnRequest.setNameIDPolicy(nameIDPolicy);
  23. return authnRequest;
  24. }

生成对象后转化成字符串:

  1. Document document = asDOMDocument(authnRequest);
  2. DOMSource source=new DOMSource(document);
  3. TransformerFactory tf = TransformerFactory.newInstance();
  4. Transformer former=tf.newTransformer();
  5. former.setOutputProperty(OutputKeys.STANDALONE, "yes");
  6. StringWriter sw = new StringWriter();
  7. StreamResult sr = new StreamResult(sw);
  8. former.transform(source, sr);
  9. String result=sw.toString();

将 xml 字符串进行 base64 编码后拼接成认证请求地址发起认证请求,认证请求地址示例如下:

  1. http://localhost:8080/idp/sso?SAMLRequest=fZJdT8IwFIb/SnPuy7qhwBqGQYmRxA8i0wvvSneQJl07ezo//r1zQKKJets+ed+e53R69l5b9oqBjHcFpAMBDJ32lXHPBTyUl3wCjKJylbLeYQHOw9lsSqq2jZy3cefu8aVFiqzLcST7iwLa4KRXZEg6VSPJqOV6fnMts4GQTfDRa2+BzYkwxK74wjtqawxrDK9G48P9dQG7GBuZJNZrZXeeopyIiUioSfQBBrboeo1TsX/677ypmoTIA1suCsiHW9SjVPBTvVX8JB/lPNfVho+z0ViMhgKHm9OOJGpx6b6GjgVkIh3zNONZWopcZpnMJgMhTp6ArQ5znBu3t/Xf0Js9RPKqLFd8dbcugT0erXcA7J3Kvjx8k/l/rDoahNlfvqbJt+Dj5m67pOVi5a3RH2xurX+7CKhit98YWgR26UOt4t/d6SDtT0zFtz0qW0cNarM1WEEy25f+/CGzTw==

后续就是 IDP 收到该请求后解析、认证、返回的过程了

SAML2.0 协议初识(二)---Service Provider(SP)的更多相关文章

  1. SAML2.0 协议初识(一)

    一.什么是 SAML 协议? SAML 即安全断言标记语言,英文全称是 Security Assertion Markup Language.它是一个基于 XML 的标准,用于在不同的安全域(secu ...

  2. SAML2.0 协议初识(三)——IDP

    IDP,即提供身份认证服务的一端,通常,当 IDP 接收到 SP 发送的 SAML 认证请求后,解析 SAMLRequest 参数,包括 acs 地址.SP EntityId.绑定方式.是否加密等信息 ...

  3. 安全声明标记语言SAML2.0初探

    目录 简介 SAML的构成 SAML的优势 SAML是怎么工作的 SP redirect request; IdP POST response SP POST Request; IdP POST Re ...

  4. 探索 ASP.Net Core 3.0系列三:ASP.Net Core 3.0中的Service provider validation

    前言:在本文中,我将描述ASP.NET Core 3.0中新的“validate on build”功能. 这可以用来检测您的DI service provider是否配置错误. 具体而言,该功能可检 ...

  5. TCP/IP协议(二)tcp/ip基础知识

    今天凌晨时候看书,突然想到一个问题:怎样做到持续学习?然后得出这样一个结论:放弃不必要的社交,控制欲望,克服懒惰... 然后又有了新的问题:学习效率时高时低,状态不好怎么解决?这也是我最近在思考的问题 ...

  6. 【Java实战】源码解析Java SPI(Service Provider Interface )机制原理

    一.背景知识 在阅读开源框架源码时,发现许多框架都支持SPI(Service Provider Interface ),前面有篇文章JDBC对Driver的加载时应用了SPI,参考[Hibernate ...

  7. HTTP协议(二)header标头说明

    HTTP协议(二):header标头说明 Header 解释 示例 Accept-Ranges 表明服务器是否支持指定范围请求及哪种类型的分段请求 Accept-Ranges: bytes Age 从 ...

  8. 基于SAML2.0的SAP云产品Identity Authentication过程介绍

    SAP官网的架构图 https://cloudplatform.sap.com/scenarios/usecases/authentication.html 上图介绍了用户访问SAP云平台时经历的Au ...

  9. laravel5如何创建service provider和facade

    laravel5如何创建service provider和facade laravel5创建一个facade,可以将某个service注册个门面,这样,使用的时候就不需要麻烦地use 了.文章用一个例 ...

随机推荐

  1. iOS:iOS中的几种动画

    本文来自收藏,感谢原创博主. iOS中的动画 摘要 本文主要介绍核iOS中的动画:核心动画Core Animation, UIView动画, Block动画, UIImageView的帧动画. 核心动 ...

  2. iOS:CALayer核心动画层

    CALayer:核心动画层 简介: Core Animation 是跨平台的,支持iOS环境和Mac OS X环境 学习核心动画之前,需要先理解CALayer,因为核心动画操作的对象不是UIView, ...

  3. SQL_MODE设置讲解

    SQL_MODE可能是比较容易让开发人员和DBA忽略的一个变量,默认为空.SQL_MODE的设置其实是比较冒险的一种设置,因为在这种设置下 可以允许一些非法操作,比如可以将NULL插入NOT NULL ...

  4. python爬虫之scrapy框架

    Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 其可以应用在数据挖掘,信息处理或存储历史数据等一系列的程序中.其最初是为了页面抓取 (更确切来说, 网络抓取 )所设计的, 也可以 ...

  5. enter 键登录的实现

    js 代码 document.onkeypress = function() { var iKeyCode = -1; if (arguments[0]) { iKeyCode = arguments ...

  6. mysql有关问题之:the security settings could not be applied to

    mysql问题之:the security settings could not be applied to 转自:http://www.myexception.cn/mysql/503556.htm ...

  7. 数据採集器服务——Socket(今天才发现AES加解密代码跟贴的时候不一样,貌似乱码,不知什么情况)

    近期刚做的一个项目.关于 Socket TCP 通信. 需求方提供了一个 ARM 机器,及数据採集器,须要我做一个服务端与数据採集器进行交互. 目的: 数据採集器:定时将读取到的数据发送到服务端. 服 ...

  8. JMeter 八:录制脚本--使用Jmeter自带的代理服务器

    参考:http://jmeter.apache.org/usermanual/jmeter_proxy_step_by_step.pdf http://jmeter.apache.org/userma ...

  9. java阅读笔记

    前言:面向对象设计的几大原则? 1>针对接口编程,而不是针对实现编程 2>优先使用对象组合,而不是类继承 1.只根据抽象类中定义的接口来操纵对象有以下两个好处? 1)客户无须知道他们使用对 ...

  10. HDU 1073 Online Judge(字符串)

    Online Judge Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Tot ...