【问题标题】:web services - username token - Error on verifying message against security policy Error code:1000Web 服务 - 用户名令牌 - 根据安全策略验证消息时出错 错误代码:1000
【发布时间】:2012-03-13 15:37:42
【问题描述】:

我正在尝试调用在 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>

谁能告诉我我做错了什么?

谢谢。

【问题讨论】:

  • 可能没有可用的证书
  • 这个问题你解决了吗?
  • 问题解决了吗??我也遇到了,求指教!!

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    我们在从部署在 Weblogic 中的 servlet 调用 web 服务时遇到了同样的问题,使用 weblogic.jws.jaxws.ClientPolicyFeatureweblogic.wsee.security.unt.ClientUNTCredentialProvider em> 设置策略,如下所示:

    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. 将结果 Policy 对象存储到 PolicyConstants.POLICY_OVERRIDE 消息内容属性中。

    我只是在这里提到这一点,以防其他人犯了将 CXF 与 Weblogic 混合的错误。 :)

    【讨论】:

      猜你喜欢
      • 2020-05-19
      • 2015-01-12
      • 1970-01-01
      • 2018-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-12
      相关资源
      最近更新 更多