Я начал поддерживать ряд веб-сайтов, все из которых аутентифицированы с использованием системы единого входа openam. Однако, когда один из наших пользователей устанавливает постоянный файл cookie (DProPCookie), он не всегда работает.
Сценарий воспроизведения:
- Войдите в openam, установив постоянный файл cookie
- Перезапустите браузер (чтобы очистить файлы cookie сеанса)
- Перейдите на сайт A, пользователь автоматически вошел в систему из-за постоянного файла cookie.
- Перейдите на сайт B, пользователю предоставляется страница входа (они должны автоматически войти в систему).
После шага 3, если я удалю файл cookie iPlanetDirectoryPro из своего браузера, я смогу нормально войти на сайт B (используя постоянный файл cookie). Похоже, что файл cookie iPlanetDirectoryPro, созданный на сайте A, когда установлен DProPCookie, не работает на сайте B.
Обратите внимание, что я пробовал различные перестановки сайтов A и B, и в каждом случае сценарий был одинаковым.
Я новичок в openam, поэтому любые подсказки о том, как это отладить, были бы замечательными, или если я упустил что-то явно не так, пожалуйста, дайте мне знать.
Заранее спасибо.
РЕДАКТИРОВАТЬ:
Впоследствии я обнаружил, что файл cookie iPlanetDirectoryPro, возвращаемый при аутентификации с использованием DProPCookie, не работает. Таким образом, это не имеет ничего общего с перекрестным доменом.
- Войдите в openam, установив постоянный файл cookie
- Перезапустите браузер (чтобы очистить файлы cookie сеанса)
- Перейдите на сайт A, пользователь автоматически вошел в систему из-за постоянного файла cookie.
- Удалить все файлы cookie, кроме файлов cookie iPlanetDirectoryPro.
- Обновить страницу - попросили авторизоваться
Если я повторю тест, но с файлом cookie iPlanetDirectoryPro, сгенерированным при обычном входе в систему, то при обновлении страницы я автоматически пройду аутентификацию. (Я изменил название вопроса, чтобы отразить это).
ДАЛЬНЕЙШЕЕ РЕДАКТИРОВАНИЕ:
Включил отладку - вижу это исключение в логах:
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);
}