我已经开始维护许多使用openam SSO进行身份验证的网站。但是,当我们的一个用户设置一个持久性cookie(DProPCookie)时,它并不总是有效。
Repro场景是:
在第3步之后,如果我从浏览器中删除iPlanetDirectoryPro cookie,我可以登录到网站B(使用持久性cookie)。似乎在设置DProPCookie时从站点A生成的iPlanetDirectoryPro cookie在站点B上不起作用。
请注意,我尝试过使用站点A和站点B的各种排列,并且每种情况都是相同的。
我对openam很新,所以任何关于如何调试这个的提示都会很棒,或者如果我遗漏了一些明显出错的东西请告诉我。
提前致谢。
编辑:
我后来发现使用DProPCookie进行身份验证时返回的iPlanetDirectoryPro cookie无效。因此与跨域无关。
如果我重复测试但使用正常登录生成的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);
}
答案 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中。