1

环境:

  • 多功能一体机 6.3 工作室 Windows 7
  • MFP 6.3 服务器 (WAS LC)

从 IBM MobileFirst Platform Developer Center下载了基于表单的样本。

在 MFP 6.3 Studio 中,示例运行良好。

然后我更改我的构建设置并构建所有环境-> 获取新的 wlapp 文件。

我从 MFP 6.3 服务器获取我的战争文件。打开并放入修改后的 authenticationConfig.xml 基本上它只是将一个片段从工作室 authenticationConfig.xml 传输到 WAR 文件中的 xml 文件。

<customSecurityTest name="DummyAdapter-securityTest">
    <test isInternalUserID="true" realm="SampleAppRealm"/>
</customSecurityTest>       

我重新启动服务器并部署 .wlapp 和 .adapter 文件。

在独立服务器中,我运行预览模式。I 输入用户名和密码并登录。它没有登录,我在服务器 console.log 上看到了这些错误。

[ERROR   ] SESN0008E: A user authenticated as anonymous has attempted to access a session owned by user:BasicRegistry/demo.
[ERROR   ] SRVE0232E: Internal Server Error. Exception Message: [com.ibm.ws.webcontainer.webapp.WebAppErrorReport: com.ibm.websphere.servlet.session.UnauthorizedSessionRequestException: SESN0008E: A user authenticated as anonymous has attempted to access a session owned by user:BasicRegistry/demo.
    at com.ibm.ws.webcontainer.session.impl.HttpSessionContextImpl.checkSecurity(HttpSessionContextImpl.java:686)
    at [internal classes]
    at com.worklight.core.auth.impl.AuthenticationFilter.associateAuthContextWithThread(AuthenticationFilter.java:426)
    at com.worklight.core.auth.impl.AuthenticationFilter.doFilter(AuthenticationFilter.java:145)
    at com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter(FilterInstanceWrapper.java:194)
    at [internal classes]
Caused by: com.ibm.websphere.servlet.session.UnauthorizedSessionRequestException: SESN0008E: A user authenticated as anonymous has attempted to access a session owned by user:BasicRegistry/demo.
    ... 7 more
]
[ERROR   ] SRVE0777E: Exception thrown by application class 'com.worklight.core.auth.impl.AuthenticationContext.checkAuthentication:604'
com.worklight.server.auth.api.WorkLightAuthenticationException
    at com.worklight.core.auth.impl.AuthenticationContext.checkAuthentication(AuthenticationContext.java:604)
    at com.worklight.core.auth.impl.AuthenticationContext.processRealms(AuthenticationContext.java:469)
    at com.worklight.core.auth.impl.AuthenticationContext.pushCurrentResource(AuthenticationContext.java:443)
    at com.worklight.core.auth.impl.AuthenticationServiceBean.accessResource(AuthenticationServiceBean.java:75)
    at com.worklight.integration.services.impl.DataAccessServiceImpl.invokeProcedureInternal(DataAccessServiceImpl.java:430)
    at com.worklight.integration.services.impl.DataAccessServiceImpl.invokeProcedure(DataAccessServiceImpl.java:139)
    at com.worklight.gadgets.serving.handler.BackendQueryHandler.getContent(BackendQueryHandler.java:95)
    at com.worklight.gadgets.serving.handler.BackendQueryHandler.doPost(BackendQueryHandler.java:56)
    at com.worklight.gadgets.serving.GadgetAPIServlet.doGetOrPost(GadgetAPIServlet.java:148)
    at com.worklight.gadgets.serving.GadgetAPIServlet.doPost(GadgetAPIServlet.java:108)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:595)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:668)
    at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1240)
    at [internal classes]
    at com.worklight.core.auth.impl.AuthenticationFilter$1.execute(AuthenticationFilter.java:217)
    at com.worklight.core.auth.impl.AuthenticationServiceBean.accessResource(AuthenticationServiceBean.java:76)
    at com.worklight.core.auth.impl.AuthenticationFilter.doFilter(AuthenticationFilter.java:222)
    at com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter(FilterInstanceWrapper.java:194)
    at [internal classes]
4

2 回答 2

3

在研究了 securityIntegrationEnabled="false 解决方法之后,我想我已经弄清楚了为什么事情正常/不正常。

解决办法其实很简单,不用修改server.xml。

当发生错误 SESN0008E 时,我正在使用通用预览模式通过单击独立服务器中管理控制台的链接来测试 FormAuth 应用程序。虽然普通的预览链接打开到了新的浏览器,但 sessionID 却实际上保留了下来。两个浏览器选项卡都在同一个会话中(我检查过)。

这意味着我使用的 sessionID 实际上是已经通过管理控制台验证的那个。在我的预览模式下,我尝试在另一个用户已经“拥有”的会话中再次进行身份验证。这会导致 WAS 抛出错误 SESN0008E:作为匿名身份验证的用户已尝试访问 user:BasicRegistry/demo 拥有的会话。我的应用预览与管理控制台在同一个 httpsession 中,因此出现了错误。

所以为了让它工作,我复制了预览链接。关闭所有浏览器以确保会话被终止。打开一个新的浏览器,粘贴预览链接,FormAuthentication 现在可以工作了。

一个可能更方便的解决方案是创建一个移动 Web 环境并将其用于预览测试。

于 2015-01-09T22:43:01.910 回答
0

在 WAS 和 WAS Liberty 配置文件中,默认启用安全集成。这也意味着:

...会话管理工具将用户的身份与他们的 HTTP 会话相关联。此功能会将会话标记为由第一个访问尚未标记为拥有的会话的用户“拥有”。

如果会话已被标记为已拥有,它将检查所有者是否与当前用户相同。如果不是,则不会授予对会话的访问权限,而是至少会记录一条标识符为 SESN0008E 的消息,并且不会授予对会话的访问权限。

在某些情况下,会引发 UnauthorizedSessionRequestException,原因是消息 SESN0008E。

在 Eclipse 中的 MobileFirst Development Server 中,底层 WAS Liberty 的 server.xml 已禁用此功能。

对于您的 POC 作为一种解决方法,您可以通过在 server.xml 文件中添加以下条目来禁用该功能:<httpSession securityIntegrationEnabled="false"/>

请注意,添加此设置对所有应用程序都是全局的,并且可能会对服务器上的现有应用程序(如果存在)产生负面影响。

于 2015-01-09T21:31:19.003 回答