单点退出(SLO)

最后更新:2021-12-2

1. SP SLO

1.1. 概述

SP SLO 一般是指基于浏览器(如 chrome, webview)登录后(业务系统登录),或通过单点登录(SSO)后用户通过手动点击 SP 退出进行触发,需要将 IDaaS 平台皆退出的场景。

注意:不适用于 C/S 客户端(如 WIFI,智能设备)登录后的场景。

1.2. 术语定义

参考:IDP中产品术语介绍


1.3. 场景描述

1.3.1. 全局退出

全局统一退出场景一般是指基于浏览器(如 chrome, webview)登录后(不管是业务系统登录还是 IDaaS 平台登录),或通过单点登录(SSO)后用户通过手动点击退出进行触发,需要将业务系统与 IDaaS 平台皆退出的场景。

当 SP 退出成功后,通过调用 IDaaS 平台的退出 API 实现。

适用所有 IDaaS 平台中已经集成的应用插件。


1.3.2. 标准协议退出

支持基于标准安全协议所开发应用插件的退出,目前包括 CAS2.0 协议,OAuth2 协议与 SAML2.0 协议

1.3.2.1. CAS2.0 应用退出

IDaaS 平台中实现了标准的 CAS2.0 协议应用插件,可根据标准的协议定义的 SLO 集成实现统一退出逻辑。

1.3.2.2. OAuth2 应用退出

IDaaS 平台中实现了标准的 OAuth2 协议应用插件,并针对 OAuth2 协议提供了退出 API,通过此 API 实现当 SP 退出时 IDaaS 平台也退出。


1.3.2.3. SAML2.0 应用退出

IDaaS 平台中实现了标准的 SAML2.0 协议应用插件,可根据标准的协议定义的 SLO 集成实现 SP 退出逻辑。


1.4. 具体集成

1.4.1. 全局退出

1.4.1.1. 流程说明

整体的流程如下图所示。
image.png

  1. SP 中用户退出系统。

  2. SP 退出后在浏览器中调用 IDP 登出地址(详见 API 信息)

  3. IDP 中可清除 IDaaS session、cookie、token,注销会话

  4. 退出后回到登录界面可再次进行登录(若退出时指定了 redirect_url 参数则会跳转回指定的 URL)

  5. 在 IDP 中发起 SSO 可再次登录成功 SP 应用


1.4.1.2. API 信息

在流程中第 3 步需要调用 IDP 提供的 API 完成退出功能,需要在浏览器中调用,API 信息如下:
请求地址: /public/sp/slo/{appId}
请求方法: GET,POST
请求参数:

参数名称

参数类型

是否必须

示例

备注

appId

text

idaasoauth2

应用 ID,此处为门户应用

redirect_url

text

https%3A%2F%2Fwww.idsmanager.com%2F

退出成功后跳转的 URL 地址,可选(若不传或为空则跳转回 IDP 登录页),此处传递门户登录地址,注意使用 urlencode

access_token

text

xxxxxxxxx

IDP 签发的用户令牌 access_token,可选,若有值则将 access_token 置为无效状态

请求示例http://{IDaaS_server}/public/sp/slo/idaasoauth2?access_token={access_token}&redirect_url={portal_login_url}
注意事项:推荐使用 POST 请求方式,将参数 redirect_urlaccess_token 放在 form 表单中提交。

1.4.1.3. 界面展示

以 JWT 应用为例进行说明

在 IDP 的管理界面中添加成功成功后,在应用详情中的“IDP SLO 地址” 即为完整的 API 信息。
20210428174909.jpg

1.4.2. 标准协议退出

1.4.2.1. CAS2.0 应用退出

1.4.2.1.1. 如何添加 CAS2.0 应用

CAS2.0 协议在 IDaaS 平台中叫 CAS(标准) 应用。管理员登录 IDaaS 平台后,依次点击 应用 -> 添加应用 -> CAS(标准) 即可进行添加。
image.png

1.4.2.1.2. 如何获取 CAS2.0 应用的退出地址等信息

添加成功 CAS 应用后,可在应用详情中获取 CAS 协议中定义的各类信息,如:CAS Login UR、 Logout URL 等信息。
image.png

1.4.2.1.3. 如何集成退出

以 JAVA 语言开发的 cas-client 端来进行说明

1.4.2.1.3.1. 引入依赖

在 CAS Client 端(即 SP 业务系统)中集成退出,需要先在工程中增加 cas-client jar 或引入 maven 依赖

<dependency>
    <groupId>org.jasig.cas.client</groupId>
    <artifactId>cas-client-core</artifactId>
    <version>3.4.1</version>
</dependency>

1.4.2.1.3.2. 配置 SingleSignOutFilter

然后根据 CAS 应用的相关信息配置 SingleSignOutFilter (web.xml 中),一配置示例如下:

  <!--
  退出, 注意顺序,  不能修改
  CAS logout
  -->
  <filter>
      <filter-name>CAS Single Sign Out Filter</filter-name>
      <filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class>
      <init-param>
          <param-name>casServerUrlPrefix</param-name>
          <!-- 配置值来自 CAS应用的 详细 页面 'CAS Server URL Prefix' -->
          <param-value>https://xxx-test.com/enduser/api/application/cas_apereo/idaascas_apereo/logout</param-value>
      </init-param>
  </filter>
  <filter-mapping>
      <filter-name>CAS Single Sign Out Filter</filter-name>
      <url-pattern>/*</url-pattern>
  </filter-mapping>

1.4.2.2. OAuth2 应用退出

1.4.2.2.1. 如何添加 OAuth2 应用

OAuth2 协议在 IDaaS 平台中叫 OAuth2 应用。管理员登录 IDaaS 平台后,依次点击 应用 -> 添加应用 -> OAuth2 即可进行添加。
image.png
关键参数说明:
Redirect URI:重定向地址
GrantType 支持三种 OAuth2 GrantType:

  • authorization_code

  • implicit

  • PKCE


添加成功后在应用详情中可查看具体的属性。
image.png

1.4.2.2.2. 如何集成退出

OAuth2 应用退出可使用 IDaaS 平台统一提供的 SLO 退出逻辑,当 OAuth2 客户端(client)需要退出时,先退出客户端应用,再调用 IDaaS 平台退出地址,传递 access_token 等完成统一退出,退出 API 和全局退出 API 一致:
定义如下:
请求地址:/public/sp/slo/{appId}
请求方法:GET POST
请求参数:

参数名称

参数类型

是否必须

示例

备注

appId

text

idaasoauth2

应用 ID,此处为门户应用

redirect_url

text

https%3A%2F%2Fwww.idsmanager.com%2F

退出成功后跳转的 URL 地址,可选(若不传或为空则跳转回 IDP 登录页),此处传递门户登录地址,注意使用 urlencode

access_token

text

xxxxxxxxx

IDP 签发的用户令牌 access_token,可选,若有值则将 access_token 置为无效状态

请求示例http://{IDaaS_server}/public/sp/slo/idaasoauth2?access_token={access_token}&redirect_url={portal_login_url}
注意事项:推荐使用 POST 请求方式,将参数 redirect_urlaccess_token 放在 form 表单中提交

1.4.2.3. SAML2.0 应用退出

1.4.2.3.1. 如何添加 SAML2.0 应用

SAML2.0 协议在 IDaaS 平台中叫 SAML 应用。管理员登录 IDaaS 平台后,依次点击 应用-> 添加应用 -> SAML 即可进行添加。添加分两步完成:第一步创建或导入 SigningKey(证书信息),第二步配置 SAML 应用信息。
image.png

image.png

1.4.2.3.2. 如果集成退出
  1. 在 SAML 应用详情中导出 IDaaS SAML 元配置文件。

image.png
打开导出的元配置文件可以查看到具体的信息。
image.png
从中可看到 IDaaS 平台退出支持 Redirect 与 POST 两种方式。

  1. 在 SP 业务系统中配置 SAML 的各类信息(此步骤不同的 SP 配置方式不一样,具体请参考 SP 提供的 SAML 配置文档)。一般在配置完成后即可实现 SSO 与统一退出功能(若有需要可根据具体的 SP 应用提供具体的使用文档)。


1.5. 注意事项

  1. 所有请求与响应使用的字符编码统一为 UTF-8。

  2. 请求的参数中,若参数值为 URL 格式的,推荐进行 URL Encode。

2. IDP SLO

2.1. 概述

IDP SLO 一般是指基于浏览器(如 chrome, webview)登录后(IDaaS 平台登录),用户通过手动点击退出进行触发,需要将 SP 业务系统皆退出的场景。

注意:不适用于 C/S 客户端(如 WIFI,智能设备)登录后的场景。

2.2. 术语定义

参考:IDP中产品术语介绍


2.3. 场景描述

当 IDaaS 平台在浏览器中点击“退出”操作时,IDaaS 平台退出后,通过浏览器打开 SP 指定的退出地址进行退出。
注意:截止 v4.11 版本,只有 JWT 应用插件支持此功能。

2.4. 具体集成

2.4.1. 如何配置 SP 退出 URL

  1. 管理员登录 IDaaS 平台后,依次点击 应用 -> 添加应用 -> JWT ,在添加的表单中启用 SP 支持退出并填写 SP 退出地址,如下图:

image.png
SP 退出地址必须是一个完整的 URL 地址,支持 GET 方式访问,IDaaS 平台退出后会自动打开此地址通知 SP 应用进行退出。

  1. 添加应用时填写的 SP 退出地址,可在编辑时进行修改,在应用详情中查看具体的配置信息。

image.png

2.4.2. 具体流程与参数说明

  1. 当用户登录 IDP 后,在应用列表中 SSO 到各应用时,IDP 记录当前账户的应用 SSO 登录信息。信息包括:账户信息(systemUserUuid),应用信息(purchaseId),IP 地址与浏览器信息。

  2. 当 IDP 退出时,前端调用退出 API(/api/bff/v1.2/commons/logout),服务器根据应用配置与记录的登录信息响应需要全局退出的应用退出地址(包括参数 state),由前端通过浏览器每个应用打开一 tab 调用应用退出地址触发 SP 的退出。

2.4.3. 参数 state 说明

当 IDP 退出时,都会在浏览器打开应用填写的退出地址,并带上 state 参数,如:http://www.sptest.com/sp/logout?state=efdfadfads…
state 参数值是 JWT 格式的数据,SP 应用可使用 JWT 的 publicKey 进行校验(verify)以证明其为 IDP 发起(这与 SSO 时校验 id_token 处理一致,有效时间 5 分钟),验签流程可参考:【单点登录】-【插件式 SSO(JWT)】,防止别人篡改。verify 的结果 payload 中包含信息示例如下:
image.png

{
	"aud": ["enterprise_mobile_resource", "bff_api_resource"],
	"exp": 1620359202,
	"user_name": "jk_admin",
	"jti": "3b5c7af1-b580-4c9c-b13c-c062ba74e01d",
	"client_id": "3fc4771645bf5a196a6371f225d86102qINVv5B63nO",
	"scope": ["read"]
}
  • jti:一个 UUID 随机值

  • iat:签发时间值

  • exp:过期时间值

  • iss:签发者,一般是 IDP 访问地址

  • aud:应用插件 ID

  • sub:退出的用户名

2.4.4. SP 退出 URL 实现示例

由 IDP 调用的 SP 退出 URL 的实现具体要根据 SP 应用的退出逻辑来。一般会清空会话(session)中的登录用户信息,记录退出日志或一些其他逻辑。下面是一个实现示例,供参考。
1610436719091-0f88dd33-cc09-4d37-b7fc-3bfc1fb34d3d.jpeg

2.5. SDK下载

JAVA SDK下载 Java JWT SDK 下载
当然,如果您的业务系统是除此之外其他语言也可以进行对接,需要您自行编写解析 state 的代码,可以参考JWT 官网

2.6. 注意事项

  1. 所有请求与响应使用的字符编码统一为 UTF-8。

  2. 请求的参数中,若参数值为 URL 格式的,推荐进行 URL Encode。