Liberty Repository[8.5.5.4 或更高版本]

对 OpenID Connect 调用会话管理端点

会话管理端点允许 OpenID Connect 依赖方监视使用特定 OpenID Connect 提供者 (OP) 的用户的登录状态,同时将网络流量降至最低。在会话管理端点的帮助下,依赖方 (RP) 可注销已从 OpenID Connect 提供者注销的用户。

开始之前

OP 会话管理端点 URL 是从 OP 的发现端点返回的发现信息中的 check_session_iframe 属性获取的。此 URL 必须用作需要会话管理功能的 RP 应用程序的 iframe 的目标。RP 应用程序还必须知道 iframeid 属性以向其提交 Window.postMessage() 请求。

关于此任务

为帮助确定用户的登录状态,RP 装入其 src 目标设置为 OP 的会话管理端点的 iframe。会话管理端点可访问用于存储用户的登录状态或浏览器状态的 cookie。此浏览器状态 cookie 在用户从 OP 注销时更新。然后,RP 可使用客户机端脚本调用 OP iframeWindow.postMessage() 函数,以在消息文本中发送客户机标识和当前已知会话状态。如果 RP 接收到从 OP 框架返回的 postMessage 且其值为 changed,那么 OP 上的用户的登录状态已更改,并且 RP 可决定是否注销该用户。如果返回的值为 unchanged,那么该用户在 OP 上仍处于已登录状态。

已启用 OpenID Connect 的 Liberty 概要文件服务器可访问位于以下 URL 的 OpenID Connect 会话管理端点:

https://server.example.com:443/oidc/endpoint/<provider_name>/check_session_iframe
注: 在此示例中,OP 的 SSL 端口应该为 443。

过程

  1. 在能够装入以 OP 会话管理端点为目标的 iframe 的相应 RP 应用程序中创建 Web 资源。此 Web 资源还需要具有对授权响应的 session_state 参数中返回的会话状态值的访问权。例如,会话状态值可存储在 cookie 中,或通过允许 Web 资源中的客户机端脚本知道此值的任何其他方式存储。以下是这类 iframe 的样本 HTML 片段。
    <iframe id="iframeOP" src="https://server.example.com:443/oidc/endpoint/OidcConfigSample/check_session_iframe" frameborder="0" width="0" height="0"></iframe>
  2. 要检查用户的登录状态,请调用 OP iframeWindow.postMessage() 函数(将客户机标识和会话状态作为消息参数以 Client ID + " " + Session State 格式传递,并将 OP 的主机名作为目标起源参数传递)。在以下 JavaScript 样本函数中,该脚本期望会话状态值存储在名为 session_state 的 cookie 中,并且 getCookieValue() 函数返回存储在 session_state cookie 中的值。
    	var targetOP = "https://server.example.com:443";
    	function checkStatus() {
               var client = "client01";
               var sessionState = getCookieValue("session_state");
               var text = client + " " + sessionState;
               var iframe = document.getElementById("iframeOP");
               iframe.contentWindow.postMessage(text, targetOP);
    	}
  3. 配置 Web 资源以侦听来自 OP 的 postMessages,它们包含值 changedunchanged 以反映用户的对应登录状态。然后,RP 可根据从 OP 返回的值决定是否让该用户从 RP 注销。此函数必须确保 postMessage 的源与预期 OP 主机名匹配。不匹配的所有消息被拒绝。以下 JavaScript 示例说明如何向 Web 资源添加事件侦听器以侦听这类消息。
    	var targetOP = "https://server.example.com:443";
    	window.addEventListener("message", receiveMessage, false);
    	function receiveMessage(event) {
               if (event.origin !== targetOP) {
                         // Origin did not come from the OP; this message must be rejected.
                         return;
               }
               if (event.data === "unchanged") {
                         // User is still logged in to the OP
                       } else {
                         // User has logged out of the OP
               }
    	}

结果

现在 RP 上具有能够在 Liberty 概要文件服务器 OP 上使用 OpenID Connect 的会话管理功能的 Web 资源。在 OP iframe 中维护的浏览器状态会在用户登录 OP 或从 OP 注销时更新。在 OP 上成功登录后,系统会在授权响应中向 RP 提供新会话状态值。然后 RP 可使用客户机端脚本验证用户的会话状态,以确定用户的登录状态在 OP 上是否已更改而不必广播额外的网络流量。

示例

以下 HTML 示例显示一个使用 OpenID Connect 会话管理的完整 HTML 页面。OP iframesrc 属性设置为从 OP 获取的会话管理端点 URL。系统以 60 秒一次的频率自动调用 startChecking() 函数以检查用户的登录状态。此页面具有 message 事件侦听器,接收到 postMessage 时,此侦听器会调用 receiveMessage() 函数。此函数确保 postMessage 来自 OP 的预期域,并检查所返回消息的值以了解用户的登录状态是 changed 还是 unchanged

可将此 HTML 页面本身作为 RP 内另一 Web 资源中的不可视 iframe 装入。这允许装入此 iframe 的任何 Web 资源在客户端监视用户的登录状态。
	<!DOCTYPE html>
	<html>
	<head>
	<meta charset="ISO-8859-1">
	<title>iFrame RP Page</title>
	</head>
	<body onload="javascript:startChecking()">
            <iframe id="iframeOP" src="https://localhost:8999/oidc/endpoint/OidcConfigSample/check_session_iframe" frameborder="0" width="0" height="0"></iframe>
	</body>
	<script>
            var targetOP = "https://server.example.com:443";
		
            window.addEventListener("message", receiveMessage, false);
		
            function startChecking() {
                      checkStatus();
                      // Check status every 60 seconds
                      setInterval("checkStatus()", 1000*60);
            }
		
            function getCookieValue(cookieName) {
                      var name = cookieName + "=";
                      var cookies = document.cookie.split(';');
                      if (!cookies) {
                                return null; 
                      }
                      for (var i = 0; i < cookies.length; i++) {
                                var cookie = cookies[i].trim();
                                if (cookie.indexOf(name) == 0) {
                                          return cookie.substring(name.length, cookie.length);
                                }
                      }
                      return null; 
            }
		
            function checkStatus() {
                      var client = "client01";
                      var sessionState = getCookieValue("session_state");
                      var text = client + " " + sessionState;
                      var iframe = document.getElementById("iframeOP");
                      iframe.contentWindow.postMessage(text, targetOP);
            }
		
            function receiveMessage(event) {
                      if (event.origin !== targetOP) {
                                // Origin did not come from the OP; this message must be rejected
                                return;
                      }
                      if (event.data === "unchanged") {
                                // User is still logged in to the OP
                              } else {
                                // User has logged out of the OP
                      }
            }
	</script>
	</html>

用于指示主题类型的图标 任务主题

信息中心的条款和条件 | 反馈


时间戳记图标 最近一次更新时间: Wednesday, 2 September 2015
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=phil&product=was-libcore-mp&topic=twlp_oidc_session_mgmt_endpoint
文件名:twlp_oidc_session_mgmt_endpoint.html