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