我正在尝试使用Websphere 7和JAX-WS开发使用WS-Security的Web服务。看一些指南,似乎我必须创建一个应用服务器用户注册表并在该服务器内维护用户名/密码。反正是否有必要避免在服务器本身创建用户名,并以某种方式捕获标头并根据另一个自定义安全配置(如单点登录)进行验证?
我能够创建一个处理程序来获取标题,但是当请求中的mustUnderstands设置为1(这是必需的)时,它会在我的处理程序看到消息之前被拒绝。
我只想使用WS-Security的UsernameToken部分。
感谢任何帮助。
我的请求示例
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Header>
<wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" soapenv:mustUnderstand="1">
<wsse:UsernameToken xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" Id="unt_20">
<wsse:Username>some_username</wsse:Username>
<wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">some_password</wsse:Password>
</wsse:UsernameToken>
</wsse:Security>
</soapenv:Header>
<soapenv:Body>
...body...
</soapenv:Body>
</soapenv:Envelope>
是否可以创建自定义安全实现,以便我可以使用现有的用户验证方案?
答案 0 :(得分:1)
看起来我可以实现一个可以与我选择的安全实现交互的自定义用户注册表。 IBM文章的链接:
答案 1 :(得分:1)
另一个可能的答案是创建一个信任关联拦截器(TAI)。这基本上扩展了您当前的安全性
这是一个有用的入门链接: http://www.ibm.com/developerworks/websphere/techjournal/0508_benantar/0508_benantar.html
答案 2 :(得分:1)
您可以使用带有策略/绑定的现成WS-Security运行时来实现此目的,但您必须编写自定义代码来覆盖检查UsernameTokens的用户注册表的默认行为。
在使用UsernameToken时,请参阅此文章以使用您自己的身份验证机制:
Configuring a UsernameToken caller configuration with no registry interaction
如果您还想根据该令牌中的用户名创建WebSphere凭据,请参阅此文章:
Replacing the authentication method of the UsernameToken consumer using a stacked JAAS login module
答案 3 :(得分:0)
你能详细说明你想要达到的目标吗?
WAS服务器需要根据其用户注册表(可能是LDAP,基于文件的注册表等)验证标头中的用户名和密码。
也可以使用LTPA令牌(WebSphere和相关产品用于SSO)。
如果您列出了您的要求,那么这里的人们将能够帮助您。
HTH
Manglu
答案 4 :(得分:0)
JAX-WS应该允许你有一个自定义拦截器。
看看这个spring配置,看看我是如何将拦截器添加到服务端点的。
<jaxws:endpoint id="pqdws"
implementor="#Atypon"
address="/pqdws"
publishedEndpointUrl="@ws_webapp_url_ext@">
<jaxws:properties>
<entry key="exceptionMessageCauseEnabled" value="true"/>
<entry key="Content-length"
</jaxws:properties>
<jaxws:inInterceptors>
<bean class="org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor">
<constructor-arg>
<map>
<entry key="action" value="UsernameToken"/>
<entry key="passwordType" value="PasswordText"/>
<entry key="passwordCallbackRef">
<ref bean="passwordCallback"/>
</entry>
</map>
</constructor-arg>
</bean>
</jaxws:inInterceptors>
</jaxws:endpoint>
<bean id="passwordCallback"
class="access.ws.ServerPasswordCallback">
<property name="username" value="@ws_sec_username@"/>
<property name="password" value="@ws_sec_password@"/>
</bean>
然后,拦截器可以执行任何操作,包括调用外部服务进行身份验证。