【发布时间】:2012-11-27 09:20:20
【问题描述】:
我已经开始维护一些网站,这些网站都使用 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);
}
【问题讨论】:
-
对我来说似乎是一个错误,可能持久性 cookie 在使用帐户锁定功能时也不能很好地工作。
标签: authentication cookies persistence openam opensso