web服务- WebSphere JAX-WS跨单元身份验证



我们想要构建一个前端web应用程序来使用JAX-WS使用WPS的HumanTask API。这个web应用程序应该能够查询特定用户的当前任务,索取以前没有被任何其他用户索取的任务,完成任务等等。这个web应用程序将部署在WAS 7.0上,与提供HumanTask服务的单元不同(目前我们使用另一个WPS实例作为WAS,但最终它将是一个没有WPS功能的简单WAS)。我们通过以下步骤同步LTPA生成密钥:

  1. 登录到一个单元
  2. 转到"安全">"全局安全"。在"认证"下点击"LTPA"
  3. 在"跨单元单点登录"下
    1. 设置密码
    2. 确认密码
    3. 输入要导出LTPA密钥的文件名
    4. 点击"Export keys"
  4. 退出
  5. 将生成的文件复制到其他服务器
  6. 登录到另一个小区
  7. 转到"安全">"全局安全"。在"认证"下点击"LTPA"
  8. 在"跨单元单点登录"下
    1. 输入之前的密码
    2. <
    3. 确认密码/gh>
    4. 输入文件名和导出的LTPA密钥
    5. 点击"导入密钥"
  9. 重新启动服务器

我们用GWT开发了一个简单的web应用程序,作为概念的证明,它有一个简单的UI和一个使用HumanTask JAX-WS服务的web服务客户机。这个web应用程序是由Siteminder认证器保护的(当第一次进入web应用程序时,Siteminder代理会重定向到一个请求凭证的web表单)。Web服务客户端是按照JAX-WS标准开发的,没有添加额外的依赖项,我们依赖WebSphere JAX-WS实现(Apache Axis2)。部署后,我们测试了两个场景,没有运气:

场景:

  • 默认情况下,WPS的HumanTask服务提供者附加到策略集"BPC Web service",默认策略集绑定和策略集共享被禁用。
  • 我们将我们的HumanTask服务客户机配置为使用与服务提供者相同的策略集。
  • 登录自定义web应用程序。当尝试查询当前任务时,我们得到以下异常:

    com.ibm.wsspi.wssecurity.core.SoapSecurityException: security.wssecurity.WSSContextImpl.s02: com.ibm.websphere.security.WSSecurityException: Exception org.apache.axis2.AxisFault: CWWSS6521E: The Login failed because of an exception: javax.security.auth.login.LoginException: Login Failure: all modules ignored ocurred while running action: com.ibm.ws.wssecurity.handler.WSSecurityGeneratorHandler$2@6fef6fef
    

服务提供端没有错误信息。

情形B :

  • 更改WPS的HumanTask服务提供者配置,通过HTTP GET启用策略集共享。这样,服务提供者WSDL就包含了策略集的信息。
  • 更改服务客户端的策略集配置,以使用HTTP GET从提供者获取策略集。
  • 登录自定义web应用程序。当尝试查询当前任务时,我们得到以下异常:

    javax.xml.ws.soap.SOAPFaultException: security.wssecurity.WSSContextImpl.s02: com.ibm.websphere.security.WSSecurityException: Exception org.apache.axis2.AxisFault: CWWSS6521E: The Login failed because of an exception: javax.security.auth.login.LoginException: Login module com.ibm.ws.wssecurity.wssapi.token.impl.UNTConsumeLoginModule login() method returned false ocurred while running action: com.ibm.ws.wssecurity.handler.WSSecurityConsumerHandler$1@54a054a0
    

在到达报告先前异常的点之前,我们在服务客户端日志中看到以下警告:

CWWSS7053W: No web services security custom bindings were found. Default bindings will be used.

在服务提供商日志中,我们可以看到以下错误:

CWWSS5514E: An exception while processing WS-Security message.

并生成一组ffdc,报告我们在服务客户端获得的相同异常。

如果有人能帮助我们,那就太好了!

我们遇到了同样的问题,但通过以下步骤设法解决了它。本质上,您需要更改应用于HTM JAXWS API的默认策略集(默认值实际上只是一个示例),并使用能够通过"调用者"提取LTPA令牌中包含的标识的自定义提供程序绑定。下面的步骤:

创建自定义策略集绑定

1)点击"服务">"策略集">"常规提供者策略集绑定"2)选择"Provider sample"绑定,点击"Copy…"3)输入名称为"LTPA Authenticated Caller",然后单击OK4)在绑定列表中单击"LTPA Authenticated Caller"5)点击"WS-Security",再点击"Caller"6)点击"新建",输入以下详细信息(其他字段留空)名称:auth_ltpa调用者标识本地部分:LTPAv2调用者标识命名空间URI: http://www.ibm.com/websphere/appserver/tokentype点击OK

分配策略集和绑定

1)展开"服务",点击"服务供应商"2)点击"HTMJAXWSService"3)单击复选框,在策略集附件列表中选择HTMJAXWSService服务,然后在附加策略集下拉列表中单击"LTPA WSSecurity default"4)单击复选框,在策略集附件列表中选择HTMJAXWSService服务,然后在分配绑定下拉列表中单击"LTPA身份验证调用者"5)保存所有更改到主配置。

分配策略集和绑定

1)展开"服务",点击"服务客户端"2)单击"HTMJAXWSService"链接,其中"已部署资产"列与包含您希望配置的客户端的模块相匹配3)单击复选框,在策略集附件列表中选择HTMJAXWSService服务,然后在附加策略集下拉列表中单击"LTPA WSSecurity default"。确保该设置被所有子级别(即端口和所有方法)继承4)单击复选框,在Policy Set Attachments列表中选择HTMJAXWSService服务,然后单击Assign Binding下拉列表中的"Default"5)保存所有更改到主配置

结论

现在应该可以使用LTPA身份验证从客户端调用HTM API。为了做到这一点,您的客户端应用程序将需要配置为要求身份验证或为未经身份验证的url提供身份验证(后者将适用于期望SiteMinder TAI预填充经过身份验证的用户标识的应用程序)。

希望这对你有帮助!

最新更新