【问题标题】:TransactionalStateSupport doesn't save variablesTransactionalStateSupport 不保存变量
【发布时间】:2018-06-20 12:52:54
【问题描述】:

背景信息:

  • Pingfederate v8.4.1.0 独立版(开发中)
  • Pingfederate v8.4.1.0 集群 1 个控制台; 4 个引擎(生产中)
  • ReferenceID 适配器版本 1.3.1
  • Ubuntu 16.04

我目前正在实现一个自定义 Idp 适配器,它基本上包装了 ReferenceID 适配器并添加了其他功能。 我正在使用 TransactionalStateSupport 使 oauth-client-id(在第一个 HTTP 请求期间可作为查询参数使用)在整个事务中可访问。 不幸的是,这对我来说效果不佳。

值似乎没有被存储:

String resumePath = (String)inParameters.get("com.pingidentity.adapter.input.parameter.resume.path");
TransactionalStateSupport txStateSupport = new TransactionalStateSupport(resumePath);

String name="foo";
String value="bar";
txStateSupport.setAttribute(name, value, req, resp);
String value2 = (String) txStateSupport.getAttribute(name, req, resp);
System.out.println("Value directly after storing: " + value2);
if(!value.equals(value2))
  System.out.println("**** STORAGE FAILED ****");

输出:

B3E085C450 : Message{partnerRole=null, entityId='null', msg={partnerEntityID=testclient, scope=openid email profile, com.pingidentity.adapter.input.parameter.tracking.id=tid:cBAmXoOGkUCQXCSjRJ4quIlV5DE, response_type=code, redirect_uri=http://localhost.dev, sessionid=D5ZaljlkoPc6Bdv5l37IiyQikCK, client_id=testclient, com.pingidentity.plugin.instanceid=asd}}
2018-06-20 14:10:47,191 tid:4zBU2dUsYh8O-IRvXFjX3WOylLc DEBUG [org.sourceid.servlet.HttpServletRespProxy] adding lazy cookie Cookie{PF=hashedValue:yF4bj2jqUXu6jvMw0rBOVDuATWs; path=/; maxAge=-1; domain=null} replacing null
2018-06-20 14:10:47,191 tid:4zBU2dUsYh8O-IRvXFjX3WOylLc DEBUG [org.sourceid.saml20.service.impl.localmemory.InterReqStateMgmtMapImpl] setAttr(oldKey: null, newKey: yF4bj2jqUXu6jvMw0rBOVDuATWs, name: foo||h6tCJ)
2018-06-20 14:10:47,191 tid:4zBU2dUsYh8O-IRvXFjX3WOylLc DEBUG [org.sourceid.saml20.service.impl.localmemory.InterReqStateMgmtMapImpl] setAttr: new size of attribute map=3
2018-06-20 14:10:47,192 tid:4zBU2dUsYh8O-IRvXFjX3WOylLc INFO  [SystemOut] Value directly after storing: null
2018-06-20 14:10:47,192 tid:4zBU2dUsYh8O-IRvXFjX3WOylLc INFO  [SystemOut] **** STORAGE FAILED ****

有没有人对此有解决方案,或者知道为什么这个过程会失败?

提前谢谢你

【问题讨论】:

  • 同样在同一个事务中的第二个请求,该值不存在于事务中。我也使用 SessionStateSupport 进行了尝试,但这似乎也不起作用。我不知道我做错了什么。
  • 你可以使用会话状态而不是事务状态,就像在github.com/zandbelt/pf-store-query-params-adapter-selector中所做的那样
  • 试过了,但也没有用....我让它工作了一次,那是我已经存储了一个 PF cookie 的时候。但是删除 cookie 后,它就不再起作用了……猜猜在没有 cookie 的情况下应该无法读取 SessionStateSupport/TransactionalStateSupport(结果为 null),但应该仍然可以写入,不是吗?
  • 我相信两者都需要 cookie:PF cookie 值是对服务器状态会话缓存的引用
  • Hans 是正确的 - 在用户进行会话之前,您无法对状态/会话管理进行任何操作,而这在将 cookie 写入浏览器之前不会发生。

标签: java pingfederate


【解决方案1】:

这个问题也困扰了我很长一段时间。它有时会发生,有时不会,而且并不总是可重现的。现在我终于找到了它:

如果您在写入 HTTP 响应之前将某些内容存储在事务状态中,它会起作用。如果您首先写入 HTTP 响应,然后尝试将某些内容存储在事务状态,则会失败。如果您在写入 HTTP 响应之前将某些内容存储在事务状态,那么您也可以在之后写入事务状态。

观察

我观察到问题与 PF cookie 的长度有关:它适用于 44 个字符长的 PF cookie,但它会因 22 个字符的 PF cookie 失败(请注意,cookie 长度是可配置的,但是有单长和双长的 cookie)。

它也可以在没有任何 PF 请求 cookie 的情况下工作(这是我不同意 @Hans Z. 和 @Andrew K. 的罕见情况;-))。但是如果有效,PingFederate 在响应中设置一个 44 个字符的 PF cookie。

剩下的问题是:PingFederate 何时/为什么设置 44 个字符的 PF cookie?

背景

PingFederate 为每个请求维护一个内部 sessionID。 sessionID 对应于 PF cookie 的值。如果最初没有发送 PF cookie,则会创建一个新的 sessionID。因此,您在请求中不需要 PF cookie 即可使用事务状态。

初始 sessionID 是一个短的(22 个字符)sessionID,不适合在事务状态下存储值。如果您有一个较短的 sessionID 并尝试在事务状态下存储某些内容,PingFederate 会将 sessionID 扩展为 44 个字符。因此,如果有效,您将看到一个 44 个字符的 PF 响应 cookie。

如果响应已提交,则扩展 sessionID 的过程将失败。如果您对 response.getWriter()response.sendRedirect() 之类的响应执行任何操作,PingFederate 将“刷新 cookie”。这意味着它实际上将缓存的“惰性”cookie 添加到 HTTP 响应对象中,如以下日志条目所示:

DEBUG [org.sourceid.servlet.HttpServletRespProxy] flush cookies: adding Cookie{PF=hashedValue:dkxuW0rImM-votyz33kWkGGbj30; path=/; maxAge=-1; domain=null}

既然 cookie 已经写好了,那么 sessionID 就不能再扩展了(否则它会与浏览器接收到的不同步),并且事务状态不起作用。

恕我直言,这是 PingFederate SDK 中的一个错误。至少这是一个应该记录的限制。

解决方法

在写入 HTTP 响应之前重构您的代码以使用事务状态。如果这不可能,只需在写入 HTTP 响应之前插入一行以将虚拟属性存储在事务状态中。

我已经使用独立的 PF 9.3.0 实例对此进行了测试。

旁注

关于原来的问题:

... 使 oauth-client-id(在第一个 HTTP 请求期间可用作查询参数)在整个事务中可访问。

从 PF 9.2 开始,您可以使用“跟踪的 HTTP 参数”来使请求参数在整个事务中可用。有关详细信息,请参阅release notesSDK documentation

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-17
    • 1970-01-01
    • 2018-06-04
    • 2016-06-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多