2011-11-07 89 views
7

我負責創建將由外部客戶端使用的WCF服務。客戶端正在使用WSSE安全性,特別是他們通過SOAP頭傳遞用戶名令牌。WCF客戶端將mustUnderstand設置爲true傳遞用戶名令牌

WCF服務託管在啓用了SSL的IIS服務器上。

在這一點上,我有一個半工作原型。我現在處理的問題是,SOAP頭的mustUnderstand屬性設置爲1,這會導致進程失敗。

我想要一些建議(或更好的代碼示例微笑)如何處理用戶名令牌,以便在mustUnderstand屬性爲true時返回正確的響應。

這裏是一個的失敗的SOAP請求的例子:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://tempuri.org/"> 
     <soapenv:Header> 
      <wsse:Security soapenv:mustUnderstand="1" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"> 
      <wsse:UsernameToken> 
       <wsse:Username>TestUser</wsse:Username> 
       <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">TestPWD</wsse:Password> 
       <wsse:Nonce EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">NzU3MjFhN2YtYTlmYS00ZWZjLTkxNjktY2ExZjlkZDEwNzE5</wsse:Nonce> 
       <wsu:Created xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">2011-10-26T03:04:39Z</wsu:Created> 
      </wsse:UsernameToken> 
      </wsse:Security> 
     </soapenv:Header> 
     <soapenv:Body> 
      <tem:Getstuff> 
      <tem:Arg1>Arg1</tem:Arg1> 
      <tem:Arg2>Arg2</tem:Arg2> 
      </tem:Getstuff> 
     </soapenv:Body> 
    </soapenv:Envelope> 

如果soapenv:mustUnderstand屬性= 「1」 改變爲soapenv:mustUnderstand屬性= 「0」,則該過程的工作原理。


PS:這裏的一個修訂後的樣品請求客戶機發送:

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> 
     <s:Header> 
     <Action s:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none">http://tempuri.org/WService/Getstuff</Action> 
     <Security xmlns="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" wsu:Id="removed" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"> 
      <wsse:Username>TestUser</wsse:Username> 
      <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">TestPass</wsse:Password> 
      <wsse:Nonce>2Udx78sh2y2xRJYJpZZ9+w==</wsse:Nonce> 
      <wsu:Created>2011-09-26T19:12:48Z</wsu:Created> 
      </wsse:UsernameToken> 
     </Security> 
     </s:Header> 
     <s:Body> 
     <Getstuff xmlns="http://tempuri.org/"> 
     <Arg1>Arg1</Arg1> 
     <Arg2>Arg2</Arg2> 
     </Getstuff> 
     </s:Body> 
    </s:Envelope> 

,收到以下響應於上述請求:

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> 
     <s:Body> 
      <s:Fault> 
      <faultcode>s:MustUnderstand</faultcode> 
      <faultstring xml:lang="en-US">The header 'Security' from the namespace 'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd' was not understood by the recipient of this message, causing the message to not be processed. This error typically indicates that the sender of this message has enabled a communication protocol that the receiver cannot process. Please ensure that the configuration of the client's binding is consistent with the service's binding.</faultstring> 
      </s:Fault> 
     </s:Body> 
    </s:Envelope> 

這裏的結合:

<bindings> 
    <basicHttpBinding> 
    <binding name="TransportBind" maxBufferSize="2147483647" maxBufferPoolSize="2147483647" 
     maxReceivedMessageSize="2147483647"> 
     <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" 
     maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" /> 
     <security mode="Transport"> 
     <transport clientCredentialType="None" /> 
     </security> 
    </binding> 
    <binding name="basic" maxBufferSize="2147483647" maxBufferPoolSize="2147483647" 
     maxReceivedMessageSize="2147483647"> 
     <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" 
     maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" /> 
    </binding> 
    </basicHttpBinding> 
</bindings> 
+0

你確定它使用WSE(Web Service Extensions)嗎? –

+0

不,我不積極。我在上面的示例中添加了客戶端發送的修改後的示例請求。 –

+0

究竟是什麼「失敗」。究竟是什麼讓你相信失敗是由'mustUnderstand'造成的? –

回答

0

+1 @JohnSaunder因爲他很可能在這裏吠叫正確的樹。

是你的客戶端.NET/WCF嗎?如果沒有,它可能不會實現WS-Security,或者至少不是WCF想要的方式。

如果客戶端是.NET,這只是客戶端上不匹配的綁定。

mustUnderstand標誌表示必須確認並處理WS-Security標頭。一個非WS-Security客戶端,不管是因爲它沒有說WS-Security還是沒有配置爲WS-Security,都會忽略頭,試圖使用這個消息並且服務器會拋出。

您的其他選擇是在服務器上拒絕拒絕。它將停止發送WS-Security標題。當然,那麼你不會得到否認。

+0

我很確定它是一個Java客戶端,但我不知道是哪一種。 –

2

您的約束是basicHttpBinding。您需要使用wsHttpBinding

0

我通過在WCF配置中不使用生成的WS-Security頭(當您添加服務引用時)解決了此問題,而是將其註釋掉,而是讓.NET使用Client Credentials生成頭本身並指定「TransportWithMessageCredential」的安全模式:

client.ClientCredentials.UserName.UserName = "UserName"; 
client.ClientCredentials.UserName.Password = "Password"; 

<basicHttpBinding> 
    <binding name="Binding"> 
     <security mode="TransportWithMessageCredential"> 
      <transport clientCredentialType="None" proxyCredentialType="None" realm="" /> 
      <message clientCredentialType="UserName" algorithmSuite="Default" /> 
     </security> 
    </binding> 
</basicHttpBinding> 

(我們正在使用SSL,所以此安全設置)。

註釋掉生成的頭:

<client> 
     <endpoint ...> 
      <!--<headers> 
       <wsse:Security...> 
       </wsse:Security> 
      </headers>--> 
     </endpoint> 
</client> 

不幸的是我不知道夠不夠WCF捕獲原始SOAP請求/響應比較差,看看爲什麼ClientCredentials不會導致「無法理解「錯誤,而生成的標題。

另外,according to the MSDN文檔中,如果您只使用「傳輸」,它將不知道使用WS-Security:「將此屬性保留爲默認值,即System.ServiceModel.SecurityMode.Transport不使用WS-Security的「。

相關問題