2012-02-23 48 views
4

我試圖調用已在WSDL配置的用戶名令牌的Web服務:Web服務 - 用戶名令牌 - 錯誤的驗證對安全策略錯誤代碼信息:1000

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

有人可以告訴我我做錯了什麼?

謝謝。

+0

可能沒有可用的證書 – Alfabravo 2012-02-23 16:29:01

+0

你解決了這個問題嗎? – nadavy 2015-09-21 10:29:21

+0

已解決問題??,我面臨同樣的問題,請提出建議! – techroid 2015-11-04 11:26:22

回答

1

您是否在調用webservice時提供了用戶名和密碼? 看起來不是它提供的或用戶名/密碼不正確。

1

我們打電話時,從部署在Weblogic的一個servlet的web服務,通​​過使用weblogic.jws.jaxws.ClientPolicyFeatureweblogic.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); 

但Web服務棧通過我們的應用程序中使用實際上就是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消息內容屬性中。

我只是在這裏提到這一點,以防別人犯了混淆CXF和Weblogic的錯誤。 :)

相關問題