openam SSO を使用してすべて認証される多数の Web サイトの保守を開始しました。ただし、ユーザーの 1 人が永続的な Cookie (DProPCookie) を設定すると、常に機能するとは限りません。
再現シナリオは次のとおりです。
- 永続的な Cookie を設定して、openam にログインします。
- ブラウザを再起動します (セッション Cookie をクリアするため)
- サイト A に移動すると、永続的な Cookie により、ユーザーは自動的にログインします
- サイト B に移動すると、ユーザーにログイン ページが表示されます (自動的にログインする必要があります)。
ステップ 3 の後、ブラウザから iPlanetDirectoryPro Cookie を削除すると、サイト B に正常にログインできます (永続的な Cookie を使用)。DProPCookie が設定されている場合にサイト A から生成された iPlanetDirectoryPro Cookie は、サイト B では機能しないようです。
サイト A と B のさまざまな順列を試してみましたが、いずれの場合もシナリオは同じであることに注意してください。
私は openam にまったく慣れていないので、これをデバッグする方法についてのヒントがあれば、または明らかにうまくいかないものがない場合はお知らせください。
前もって感謝します。
編集:
その後、DProPCookie を使用した認証時に返された iPlanetDirectoryPro Cookie が機能しないことを発見しました。したがって、クロスドメインとは何の関係もありません。
- 永続的な Cookie を設定して、openam にログインします。
- ブラウザを再起動します (セッション 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);
}