веб-сервисы - токен имени пользователя - ошибка при проверке сообщения на соответствие политике безопасности Код ошибки: 1000 - PullRequest
4 голосов
/ 23 февраля 2012

Я пытаюсь вызвать веб-службу с токеном имени пользователя, настроенным в wsdl:

<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>

Запрос на мыло содержит следующую информацию для аутентификации:

<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 ]

1 голос
/ 24 сентября 2015

У нас была такая же проблема при вызове веб-службы из сервлета, развернутого в Weblogic, с использованием 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. Анализ XML-политики WS с использованием библиотеки Neethi.
  3. Сохранение объекта политики результатов в сообщении PolicyConstants.POLICY_OVERRIDEСвойство содержимого e.

Я просто упомяну это здесь на тот случай, если кто-то совершит ошибку, смешав CXF с Weblogic.:)

1 голос
/ 08 октября 2012

вы указали имя пользователя и пароль при звонке в веб-службу? Похоже, либо он не указан, либо неверное имя пользователя / пароль.

...