Web服务 - 用户名令牌 - 根据安全策略验证邮件时出错错误代码:1000

时间:2012-02-23 08:36:24

标签: java web-services jax-ws ws-security

我正在尝试调用在wsdl中配置用户名令牌的Web服务:

<sp:SupportingTokens><wsp:Policy><sp:UsernameToken sp:IncludeToken="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702/IncludeToken/AlwaysToRecipient">
<wsp:Policy>
<sp:HashPassword/>
<sp:WssUsernameToken10/>
</wsp:Policy>
</sp:UsernameToken>
</wsp:Policy>
</sp:SupportingTokens>

soap请求包含以下用于身份验证的信息:

<wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
<wsse:UsernameToken xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
<wsse:Username>user</wsse:Username>
<wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">password</wsse:Password>
</wsse:UsernameToken>
</wsse:Security>

我收到以下错误:

<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">
<env:Header/>
<env:Body>
  <env:Fault xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
     <faultcode>wsse:InvalidSecurity</faultcode>
     <faultstring>Error on verifying message against security policy Error code:1000</faultstring>
  </env:Fault>
</env:Body>
</env:Envelope>

有人可以告诉我我做错了什么吗?

谢谢。

2 个答案:

答案 0 :(得分:1)

您在调用网络服务时是否提供了用户名和密码? 看起来未提供或用户名/密码不正确。

答案 1 :(得分:1)

通过使用 weblogic.jws.jaxws.ClientPolicyFeature weblogic.wsee.security.unt.ClientUNTCredentialProvider 设置策略,如下所示:

import weblogic.jws.jaxws.ClientPolicyFeature;
import weblogic.jws.jaxws.policy.InputStreamPolicySource;
import weblogic.wsee.security.unt.ClientUNTCredentialProvider;

ClientPolicyFeature cpf = new ClientPolicyFeature();
InputStream inputStream = ChangeLogBean.class.getClassLoader().getResourceAsStream("usernametoken.xml");
cpf.setEffectivePolicy(new InputStreamPolicySource(new InputStream[]{inputStream}));

MyServiceWSPortImplService service = new MyServiceWSPortImplService(new URL(myEndpoint.getUrl()), new QName("http://myhost/myservice/V1", "MyServiceWSPortImplService"));
MyService port = service.getMyServicePort(new WebServiceFeature[]{cpf});

ArrayList credentialProviders = new ArrayList();
ClientUNTCredentialProvider untCredentialProvider = new ClientUNTCredentialProvider(myEndpoint.getUser().getBytes(), myEndpoint.getPassword().getBytes());
credentialProviders.add(untCredentialProvider);
Map context = ((BindingProvider)port).getRequestContext();
context.put(WSSecurityContext.CREDENTIAL_PROVIDER_LIST, credentialProviders);

但是我们的应用程序使用的WebServices堆栈实际上是Apache CXF,它有一种不同的方式来指定策略(通过使用 org.apache.neethi.Policy ),如下所述:

http://cxf.apache.org/docs/how-to-define-policies.html#HowtoDefinePolicies-Dynamicallyviamessageproperty

因此,CXF堆栈基本上忽略了WSSecurityContext.CREDENTIAL_PROVIDER_LIST,并且我们遇到了错误:验证安全策略消息时出错错误代码:1000

在这种情况下,正确的解决方案是使用CXF文档中描述的步骤:

  1. 从外部位置获取策略并为当前消息构建它。
  2. 使用Neethi库解析WS-Policy XML。
  3. 将结果策略对象存储到PolicyConstants.POLICY_OVERRIDE消息内容属性中。
  4. 我只是在这里提到这个,以防其他人犯了将CXF与Weblogic混合的错误。 :)