0

我有两台 tomcat 服务器,一台使用 OpenAM 12,一台使用主要的 Web 应用程序。已知:HTML 页面验证没有问题,使用 OpenAM java SDK 的编程登录在 servlet 内工作。

失败的是调用HttpServletRequest.login(username, password)

这是我在 TomEE+ 服务器中的条目:

    <Realm className="com.sun.identity.agents.tomcat.v6.AmTomcatRealm" debug="99"/>

这是我在 AM J2EEAgent 调试日志中看到的错误:

amRealm:01/29/2014 02:29:47:497 PM EST: Thread[http-bio-443-exec-3,5,main]
SSOTokenValidator: validate failed with exception
[AgentException Stack]
com.sun.identity.agents.arch.AgentException: Invalid transport string
        at com.sun.identity.agents.util.TransportToken.initializeFromString(TransportToken.java:135)
        at com.sun.identity.agents.util.TransportToken.<init>(TransportToken.java:115)
        at com.sun.identity.agents.common.SSOTokenValidator.validate(SSOTokenValidator.java:99)
        at com.sun.identity.agents.realm.AmRealm.authenticate(AmRealm.java:143)
        at com.sun.identity.agents.tomcat.v6.AmTomcatRealm.authenticate(AmTomcatRealm.java:106)
        at org.apache.catalina.realm.CombinedRealm.authenticate(CombinedRealm.java:146)
        at org.apache.tomee.catalina.TomEERealm.authenticate(TomEERealm.java:43)
        at org.apache.catalina.authenticator.AuthenticatorBase.doLogin(AuthenticatorBase.java:818)
        at org.apache.catalina.authenticator.AuthenticatorBase.login(AuthenticatorBase.java:800)
        at org.apache.catalina.connector.Request.login(Request.java:2621)
        at org.apache.catalina.connector.RequestFacade.login(RequestFacade.java:1065)
4

2 回答 2

2

用户名/密码组合的 request#login 失败,因为代理在 server.xml 中定义了自己的 Tomcat 领域定义 (AmTomcatRealm)。代理的领域不使用用户名/密码组合来验证用户,因为凭据甚至不应该存在于那里(OpenAM 执行身份验证,然后密码在您到达实际受保护的应用程序之前早已消失),这实际上有点令人担忧您仍然可以访问用户的密码。

由于代理实际上不应该知道用户的密码,它使用一个传输字符串,其中包含几个信息(在会话 ID 中),它的格式非常无证,这里是相关源代码的一些链接: https://svn .forgerock.org/openam/trunk/openam-agents/jee-agents/jee-agents-sdk/src/main/java/com/sun/identity/agents/util/TransportToken.java

此外,这不是鸡蛋问题,因为假定 JAAS 登录是由代理本身执行的,并且实际上并不期望应用程序首先调用登录。在代理设置中(当然还有 web.xml - 请参阅容器文档),有一些方法可以启用 JAAS 表单登录支持,然后代理可以处理 JAAS 集成,而无需了解任何有关专有传输字符串格式的信息。

于 2014-02-03T13:23:15.333 回答
1

对于 AgentRealm,“密码”不是密码,而是 SSO 会话中的 SSOTokenId。

于 2014-01-31T08:28:02.910 回答