在openam / opensso中使用persitent cookie时,SSO cookie无法正常工作

时间:2012-11-27 09:20:20

标签: authentication cookies persistence openam opensso

我已经开始维护许多使用openam SSO进行身份验证的网站。但是,当我们的一个用户设置一个持久性cookie(DProPCookie)时,它并不总是有效。

Repro场景是:

  1. 登录openam,设置持久性cookie
  2. 重新启动浏览器(以清除会话Cookie)
  3. 转到网站A,用户因持久性Cookie而自动登录
  4. 转到站点B,会向用户显示一个登录页面(他们应该自动登录)。
  5. 在第3步之后,如果我从浏览器中删除iPlanetDirectoryPro cookie,我可以登录到网站B(使用持久性cookie)。似乎在设置DProPCookie时从站点A生成的iPlanetDirectoryPro cookie在站点B上不起作用。

    请注意,我尝试过使用站点A和站点B的各种排列,并且每种情况都是相同的。

    我对openam很新,所以任何关于如何调试这个的提示都会很棒,或者如果我遗漏了一些明显出错的东西请告诉我。

    提前致谢。

    编辑:

    我后来发现使用DProPCookie进行身份验证时返回的iPlanetDirectoryPro cookie无效。因此与跨域无关。

    1. 登录openam,设置持久性cookie
    2. 重新启动浏览器(以清除会话Cookie)
    3. 转到网站A,用户因持久性Cookie而自动登录
    4. 删除除iPlanetDirectoryPro cookie以外的所有Cookie
    5. 刷新页面 - 要求登录
    6. 如果我重复测试但使用正常登录生成的iPlanetDirectoryPro cookie,那么当我刷新页面时,我会自动进行身份验证。 (我已经改变了问题的标题以反映这一点。)

      进一步编辑:

      打开调试 - 我在日志中看到了这个异常:

      IdName is :null
      amAuth:11/28/2012 05:11:25:750 PM GMT: Thread[TP-Processor2,5,main]
      orgName is :xxx
      amAuth:11/28/2012 05:11:25:750 PM GMT: Thread[TP-Processor2,5,main]
      AuthD.getIdentity() from IdUtils Name: null Org: xxx
      amAuth:11/28/2012 05:11:25:750 PM GMT: Thread[TP-Processor2,5,main]
      AuthD.getIdentity: Got IdRepoException while getting Identity from IdUtils: Illegal universal identifier null.
      amAuth:11/28/2012 05:11:25:750 PM GMT: Thread[TP-Processor2,5,main]
      isLockedOut:Exception :
      java.lang.NullPointerException
              at com.sun.identity.idm.server.IdCachedServicesImpl.search(IdCachedServicesImpl.java:585)
              at com.sun.identity.idm.AMIdentityRepository.searchIdentities(AMIdentityRepository.java:296)
              at com.sun.identity.authentication.service.AuthD.getIdentity(AuthD.java:1453)
              at com.sun.identity.authentication.service.AMAccountLockout.isMemoryLockout(AMAccountLockout.java:297)
              at com.sun.identity.authentication.service.AMAccountLockout.isLockedOut(AMAccountLockout.java:281)
              at com.sun.identity.authentication.service.AMAccountLockout.isLockedOut(AMAccountLockout.java:264)
              at com.sun.identity.authentication.service.AMLoginContext.processPCookieMode(AMLoginContext.java:1919)
              at com.sun.identity.authentication.service.AMLoginContext.processIndexType(AMLoginContext.java:1846)
      

      快速浏览一下openam代码 - 看来我们在AMAccountLockout.java:264中没有获得用户名:

         public boolean isLockedOut() {
      
             // has this user been locked out.
      
             String userDN = loginState.getUserToken();
      
             return isLockedOut(userDN);
      
         }
      

3 个答案:

答案 0 :(得分:1)

OpenAM中的持久Cookie模式已更改...实际上不再使用DProCookie。

可能你正在运行'限制令牌模式'AKA'cookie反劫持模式'而且CDCServlet没有发出正确的身份验证声明

答案 1 :(得分:1)

可能是你遇到了https://bugster.forgerock.org/jira/browse/OPENAM-1002? 你的cookie域也可能有问题,也许站点B重定向到DProPCookie不可见的不同域?

答案 2 :(得分:0)

最终我们发现问题是持久性cookie生成的SSO cookie没有身份验证模块 - 因此身份验证级别设置为Integer.MIN_VALUE;。

在我们的情况下,我们做了一个稍微强硬的修复,强制这个为0,这解决了问题。

我认为正确的做法是要么有一个单独的身份验证模块用于持久性cookie登录,要么将身份验证模块存储在由Persistant cookie生成的SSO cookie中。