2012-11-27 124 views
1

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

摄制的场景是:

  1. 登录openam,设置持续性的cookie
  2. 重新启动浏览器(以清晰的会话cookie)
  3. 进入站点A,用户登录时会自动持续性的cookie,因为
  4. 前往网站B,用户被呈现一个登录页面(他们应该自动登录)。

第3步后,如果我从我的浏览器删除iPlanetDirectoryPro cookie,我可以登录到站点B罚款(使用持久cookie)。看起来,设置DProPCookie时从站点A生成的iPlanetDirectoryPro cookie在站点B上不起作用。

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

我对openam相当陌生,因此有关如何调试的提示很棒,或者如果我错过了某些明显出错的地方,请告诉我。

在此先感谢。

编辑:

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

  1. 登录openam,设置持续性的cookie
  2. 重新启动浏览器(以清晰的会话cookie)
  3. 进入站点A,用户登录时会自动持续性的cookie,因为
  4. 删除除iPlanetDirectoryPro所有cookie饼干
  5. 刷新页面 - 要求登录

如果我重复测试,但与iPlanetDirectoryPro合作okie生成的正常登录然后当我刷新页面,我自动获得认证。 (我改变了问题的标题以反映这一点)。

进一步编辑:

止跌回升调试 - 我看到这个异常的日志:

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); 

    } 
+0

对于我来说看起来像一个bug,可能永久cookie在使用帐户锁定功能时也不能很好地工作。 –

回答

0

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

在我们的情况下,我们做了一个稍微黑客的修复,强制这个为0,而不是修复问题。

我认为正确的做法是为持久cookie登录提供单独的身份验证模块,或将身份验证模块存储在Persistant cookie生成的SSO cookie中。

1

Persistent Cookie模式在OpenAM中已更改... DProCookie实际上不再使用。

Posssibly你正在运行“受限制的令牌模式”又名“饼干反劫持模式”和CDCServlet没有发出正确的认证断言

+0

我使用的是openam 9.5.3版 - 我相信持久的iPlanetDirectoryPro cookie是10.0。另外,我不相信我们在限制令牌模式下运行。似乎正在发生的所有情况都是iPlanetDirectoryPro cookie,当客户端使用持久性DProPCookie进行身份验证时,返回的cookie实际上并不有效。 –

1

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

+0

该域名的问题是我的第一个想法,(因为它是在两个不同域名的网站之间首次发现的)。但是,它也发生在同一个域上的两个站点。它也似乎是我们的系统只使用一个领域。所以我们不能碰到那个错误。 还是谢谢! –