2009-09-27 22 views
60

我想要使用遠程svc web服務。我創建使用svcutil.exe代理類,在那之後我添加了類,我的控制檯應用程序,但它會產生錯誤:WCF給出了一個不安全的或不正確的安全錯誤錯誤

An unsecured error or incorrectly secured fault was received from the other party. See the inner fault exception for the fault code and detail.

System.ServiceModel.FaultException: An error occurred when verifying security for the message

我沒有創建WCF的一面,這是一個遠程SVC。請幫忙。

<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
    <system.serviceModel> 
     <bindings> 
      <basicHttpBinding> 
       <binding name="EloquaDataTransferService" closeTimeout="00:01:00" 
        openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" 
        allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" 
        maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536" 
        messageEncoding="Mtom" textEncoding="utf-8" transferMode="Buffered" 
        useDefaultWebProxy="true"> 
        <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" 
         maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
        <security mode="TransportWithMessageCredential"> 
         <transport clientCredentialType="None" proxyCredentialType="None" 
          realm="" /> 
         <message clientCredentialType="UserName" algorithmSuite="Default" /> 
        </security> 
       </binding> 
      </basicHttpBinding> 
     </bindings> 
     <client> 
      <endpoint address="https://secure.eloqua.com/API/1.2/DataTransferService.svc" 
       binding="basicHttpBinding" bindingConfiguration="EloquaDataTransferService" 
       contract="DataTransferService" name="EloquaDataTransferService" /> 
     </client> 
    </system.serviceModel> 
</configuration> 

這是我的app.config文件。我使用obj.ServiceCredentials.UserName.UserName="xxxxxx".Password="xxxXx"

<?xml version="1.0" encoding="UTF-8"?> 
<configuration> 
    <system.serviceModel> 
     <bindings> 
     <basicHttpBinding> 
      <binding name="EloquaDataTransferService" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536" messageEncoding="Mtom" textEncoding="utf-8" transferMode="Buffered" useDefaultWebProxy="true"> 
       <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
       <security mode="TransportWithMessageCredential"> 
        <transport clientCredentialType="None" proxyCredentialType="None" realm="" /> 
        <message clientCredentialType="UserName" algorithmSuite="Default" /> 
       </security> 
      </binding> 
     </basicHttpBinding> 
     </bindings> 
     <client> 
     <endpoint address="https://secure.eloqua.com/API/1.2/DataTransferService.svc" binding="basicHttpBinding" bindingConfiguration="EloquaDataTransferService" contract="DataTransferService" name="EloquaDataTransferService" /> 
     </client> 
    </system.serviceModel> 
</configuration> 
+0

這是在第一次訪問服務時發生的,還是在一段時間後發生? – Sharique

+0

沒有更多細節很難說,但聽起來像遠程服務正在期待未提供的證書或身份驗證。 – jnoss

回答

11

在我consoleApp.cs文件提供的用戶名和密碼,很明顯你與WCF安全子系統的一個問題。你使用什麼綁定?什麼認證?加密?登錄?你是否必須跨越域名界限?

有一點goggling進一步顯示,如果客戶端和服務器的時鐘不同步(超過大約五分鐘),其他人正在經歷此錯誤,因爲某些安全模式依賴於同步時鐘。

+0

感謝您的回覆!請檢查我的app.config文件,以及如何與服務器時鐘同步?我只有遠程服務器的.svc鏈接。 – user179862

+0

只要確保您的機器已設置正確的日期和時間。 –

+2

在我的情況下,服務和客戶端在同一臺機器上,但我仍然得到例外。這發生在某個時間(即10分鐘)和clientCredentialType是Windows – Sharique

3

嘗試將安全模式更改爲「傳輸」。

您在安全標籤和傳輸標籤之間不匹配。

122

這是WCF服務拋出的一個非常隱晦的錯誤。問題是WCF無法驗證傳遞給該服務的消息的安全性。

這幾乎總是因爲服務器時間偏差。遠程服務器和客戶端的系統時間必須在10分鐘內(通常)。如果不是,安全驗證將失敗。

我打電話給eloqua.com,找出他們的服務器時間,並將其與服務器時間進行比較。

+2

@ user782534如果您使用[自定義綁定](http://msdn.microsoft.com/zh-cn/library/aa738468),則可以在配置中設置偏斜.aspx),但就我所知,您無法使用默認綁定來完成此操作。我也不知道完全禁用檢查的能力。我傾向於沒有那個。 – Randolpho

+2

我打電話給遠程服務會比我的9小時內回覆我(實際上它看起來像是在SoapUI日誌中)。然後我得到了這個錯誤。響應頭包含我的senddate,但在SOAP UI日誌上我注意到響應時間總是比我的請求時間晚9個小時。怎麼會這樣?即使我改變我的本地日期時間。 Thanx –

+0

@DavutGürbüz可能是由於服務器時間錯誤。如果客戶端和服務器似乎設置爲相同的時間,我會檢查時區設置在一個或兩個電腦 - 這是可能的,他們認爲他們是在兩個不同的時區,但都顯示相同的時間。 – Randolpho

1

我也從服務參考已經過時,即使在同一臺計算機上的服務器&客戶端有這個問題。如果這是問題,運行「更​​新服務參考」通常會解決它。

1

就我而言,我在同一臺機器上,在我的測試客戶端 - 服務器應用程序中出現此錯誤。但是這個問題已通過「更新服務參考」得到解決。

  • 圖沙·G. Walavalkar
2

對於它的價值 - 我也有過這樣的錯誤,並發現它是由在Web服務web.config中的連接字符串導致被設置連接到誤機。

+0

這意味着用戶名驗證失敗。它的Xcalibur中提到他的東西[答](http://stackoverflow.com/a/7280782/1977871) – VivekDev

18

儘管您的問題已通過上述解決方案之一解決,但爲了他人的利益,以下是另一種選擇。

當不正確的憑證通過到基本端點(SOAP 1.1)時,您仍然可以獲得此異常,該基本端點使用用戶名消息憑據。例如,如果你的代碼調用服務,做這樣的事情:

var service = new TestService(); 

service.ClientCredentials.UserName.UserName = "InvalidUser"; 
service.ClientCredentials.UserName.Password = "InvalidPass"; 

這是從WSHTTP端點(SOAP 1.2)不同的是,當無效憑據穿過拋出AccessDeniedException。我個人發現這裏包含的信息有點誤導(由於這個原因,第一次遇到它時,我肯定花了幾分鐘),但是一旦我諮詢了WCF診斷跟蹤日誌,其根本原因就很明顯了。

2

在我的情況下,當我將wshttpbinding協議從https更改爲http它開始工作。

4

如果您從客戶端傳遞用戶憑證(根據以下代碼塊),那麼它應該與服務器上的用戶名/密碼匹配。否則你會得到這個錯誤。

僅供參考,在我的情況下,我正在使用「basicHTTPAuthentication」和「TransportWithMessageCredential」安全模式。 WCF服務託管在https上的IIS中。

var service = new TestService(); 

service.ClientCredentials.UserName.UserName = "InvalidUser"; 
service.ClientCredentials.UserName.Password = "InvalidPass"; 

希望這將有助於有人... :)

+0

它幫助我!該錯誤消息並不表明我可能發送了錯誤的證書,而且我也無法訪問服務代碼,所以我只是在智慧的結尾。我加倍檢查,果然,我發送了錯誤的名字。現在我可以成功地使用服務方法。 – PlayerGurl89

+3

沒有這個歸結爲*準確* [由@Xcalibur答案】(http://stackoverflow.com/a/7280782/419956)(2給出年前,具有完全相同的代碼段)? – Jeroen

4

同樣這個問題我面對我的客戶端應用程序WinForms應用程序C#4.0

當我讀到這裏的解決方案,我檢查日期&客戶端電腦的時間,但這是正確的,目前的時間顯示,但我仍然面臨這些問題。

經過一些變通後,我發現錯誤的時區選擇了,我在印度和時區是加拿大,主機服務器位於科威特。

我發現系統將時間轉換爲世界時。

當我將時區更改爲印度時區時,問題已被解決。

0

在我的情況下,有兩個問題會引發這個異常。

請注意,我的環境使用Single Sign On(或STS,如果您願意)通過ASP.NET MVC網站對用戶進行身份驗證。 MVC站點反過來通過向服務端點發送一個服務調用,將之前使用Bootstrap令牌從STS服務器請求的不記名令牌傳遞給服務端點。我得到的錯誤是當我從MVC網站進行服務調用時。

  1. WCF服務未在我的SSO(或STS)中配置爲依賴方(如果您願意的話)。

  2. 服務的配置沒有正確配置。尤其在系統身份模型的受衆使用者節點上。它必須與服務端點url完全匹配。

    <system.identityModel> 
        <identityConfiguration> 
         <audienceUris> 
          <add value="https://localhost/IdpExample.YService/YService.svc" /> 
         </audienceUris> 
         .... 
        </identityConfiguration> 
    </system.identityModel> 
    
0

確保您SendTimeout打開客戶端後還沒有過去。

0

嘗試這樣的:

catch (System.Reflection.TargetInvocationException e1) 
     String excType 
     excType = e1.InnerException.GetType().ToString() 
     choose case excType 
       case "System.ServiceModel.FaultException" 
          System.ServiceModel.FaultException e2 
          e2 = e1.InnerException 
          System.ServiceModel.Channels.MessageFault fault 
          fault = e2.CreateMessageFault() 
          ls_message = "Class: uo_bcfeWS, Method: registraUnilateral ~r~n" + "Exception(1): " + fault.Reason.ToString() 
          if (fault.HasDetail) then 
            System.Xml.XmlReader reader 
            reader = fault.GetReaderAtDetailContents() 
            ls_message += " " + reader.Value 
            do while reader.Read() 
               ls_message += reader.Value 
            loop 
          end if 
       case "System.Text.DecoderFallbackException" 
          System.Text.DecoderFallbackException e3 
          e3 = e1.InnerException 
          ls_message = "Class: uo_bcfeWS, Method: registraUnilateral ~r~n" + "Exception(1): " + e3.Message 
       case else 
          ls_message = "Class: uo_bcfeWS, Method: registraUnilateral ~r~n" + "Exception(1): " + e1.Message 
     end choose 
     MessageBox ("Error", ls_message) 
     //logError(ls_message) 
     return false 
0

我得到這個錯誤是由於basicHttpBinding的不發送兼容messageVersion給我打電話的服務。我的解決辦法是使用如下

<bindings> 
    <customBinding> 
    <binding name="Soap11UserNameOverTransport" openTimeout="00:01:00" receiveTimeout="00:1:00" > 
     <security authenticationMode="UserNameOverTransport"> 
     </security>   
     <textMessageEncoding messageVersion="Soap11WSAddressing10" writeEncoding="utf-8" /> 
     <httpsTransport></httpsTransport> 
    </binding> 
    </customBinding>  
</bindings> 
1

在我來說,我是用證書與certificateValidationMode身份驗證設置爲「PeerTrust」自定義綁定,我忘了安裝在Windows應用商店的客戶端證書(LOCALMACHINE \ TrustedPeople)使其被服務器接受。

+0

歡迎來到Stack Overflow!目前還不清楚你是否提出解決問題的方案或說你有同樣的問題。如果這是一種解決方案,您能否明確說明解決方案的工作原理? – SuperBiasedMan

+3

@SuperBiasedMan我認爲這其實很清楚。他說「我正在使用......」,「我忘記......」。可以理解的是,問題得到解決時,他想起了安裝,因此他的建議去做,他做了同樣的「在Windows中安裝存儲客戶端證書......使它被服務器接受。」 –

+1

我遇到了同樣的問題(但在我的情況下,我在LocalMachine \ Personal上安裝了證書)。 我也覺得清楚,但如果你想更詳細的說明,這裏有雲: 1.在Windows資源管理器,只是在證書文件上單擊右鍵,選擇「安裝證書」。 2.選擇「本地計算機」,然後單擊下一步 3.選擇「放入下列存儲所有證書」 4.點擊瀏覽 5.選擇適當的位置(對我來說是個人),按OK 6。按下一步,完成 –

1

只是爲了分享......我有一個罕見的案例讓我撓了腦袋幾分鐘。即使時間偏差解決方案非常準確,而且我之前解決了這個問題,這一次是不同的。我在一臺新的Win8.1機器上,我記得有一個時區問題,我手動調整了時間。那麼,儘管在服務器和客戶端中顯示的時間在幾秒鐘內只有一個差異,但我一直在收到錯誤。我所做的是在「日期和時間設置」中激活「夏季儲蓄選項」(注意我確實處於夏季儲存時間,但手動設置時間),然後進入互聯網時間部分並刷新...時間我的電腦保持完全一樣,但錯誤消失。

希望這對任何人都有用!

0

大多數情況下,當服務器出現一些錯誤,最常見的錯誤是身份驗證數據庫配置錯誤或身份驗證時,會發生此異常。在我的情況下,有不同的時鐘同步 確保客戶端和服務器具有相同的設置

點擊右下角的時間 - >「更改日期時間設置...」 - >「Internet時間」選項卡 - >更改設置... - >勾選「與Internet時間服務器同步」選項,如果沒有選中 - > 從服務器下拉列表中選擇「times.windows.com」 - >立即更新 - >確定

0

<wsHttpBinding> 
 
     <binding name="ISG_Binding_Configuration" bypassProxyOnLocal="true" useDefaultWebProxy="false" hostNameComparisonMode="WeakWildcard" sendTimeout="00:30:00" receiveTimeout="00:30:00" maxReceivedMessageSize="2147483647" maxBufferPoolSize="2147483647"> 
 
      <readerQuotas maxArrayLength="2147483647" maxStringContentLength="2147483647" /> 
 
      <security mode="None"> 
 
      <message establishSecurityContext="false" clientCredentialType="UserName"/> 
 
      </security> 
 
     </binding> 
 
     </wsHttpBinding>

0

我不得不將SecurityMode更改爲Message( WSHttpBinding)之前,它的工作。即

_wcf = new ServiceRequestClient(new WSHttpBinding(SecurityMode.Message),      
     new EndpointAddress(_wcfRequestServerAddress));