2011-02-11 72 views
2

對不起,轉發,但Im努力將我在其他帖子中讀到的內容應用於我的問題。來電未通過服務認證

我有一個自我託管的WCF服務,在我的機器上託管並且客戶機在我的機器上時運行良好。

我試圖將客戶端移動到另一臺機器,現在正在獲取「調用方未通過服務進行身份驗證」錯誤。

請有人建議問題發生的地方。

如果您需要了解更多信息,請告訴我。

親切的問候

這裏是工作

<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
    <system.serviceModel> 
    <bindings> 
     <wsDualHttpBinding> 
     <binding name="WSDualHttpBinding_IDataCollector" closeTimeout="00:01:00" 
      openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" 
      bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard" 
      maxBufferPoolSize="524288" maxReceivedMessageSize="65536" 
      messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true"> 
      <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" 
      maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
      <reliableSession ordered="true" inactivityTimeout="00:10:00" /> 
      <security mode="Message"> 
      <message clientCredentialType="Windows" negotiateServiceCredential="true" 
       algorithmSuite="Default" /> 
      </security> 
     </binding> 
     </wsDualHttpBinding> 
    </bindings> 
    <client> 
     <endpoint address="http://192.168.1.74:8080/" binding="wsDualHttpBinding" 
     bindingConfiguration="WSDualHttpBinding_IDataCollector" contract="AshService.IDataCollector" 
     name="WSDualHttpBinding_IDataCollector"> 
     <identity> 
      <userPrincipalName value="Ash-PC\Ash" /> 
     </identity> 
     </endpoint> 
    </client> 
    </system.serviceModel> 
</configuration> 

繼承人的服務器配置我的機器上的客戶端配置

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <system.serviceModel> 
    <bindings> 
     <wsDualHttpBinding> 
     <binding name="WSDualHttpBinding_IDataCollector" closeTimeout="00:01:00" 
      openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" 
      bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard" 
      maxBufferPoolSize="524288" maxReceivedMessageSize="65536" 
      messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true"> 
      <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" 
       maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
      <reliableSession ordered="true" inactivityTimeout="00:10:00" /> 
      <security mode="Message"> 
      <message clientCredentialType="Windows" negotiateServiceCredential="true" 
       algorithmSuite="Default" /> 
      </security> 
     </binding> 
     </wsDualHttpBinding> 
    </bindings> 
    <services> 
     <service name="DataCollector"> 
     <endpoint address="http://192.168.1.74:8080" binding="wsDualHttpBinding" 
      bindingConfiguration="WSDualHttpBinding_IDataCollector" contract="IDataCollector" /> 
     </service> 
    </services> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior> 
      <serviceMetadata httpGetEnabled="True"/> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    </system.serviceModel> 
</configuration> 

回答

2

你是正確的,你的問題是由於Windows身份驗證。正如Rest Wing所描述的,如果您想使用服務有權訪問的AD憑證,則必須提供這些憑證才能使服務對客戶端進行身份驗證。

如果您不能使用Windows身份驗證,並且您必須驗證客戶端,您需要查看其他身份驗證技術。一種方法是用戶名/密碼,但您需要建立自己的驗證算法。另一個是證書;服務器和客戶端必須安裝證書(X509證書工作)才能相互識別。還有其他方法,但是如果我沒有記錯的話,只有上述兩個方法才能與不在同一個域中的機器一起工作。

如果您不需要驗證客戶端,請將安全模式設置爲「無」。這將是通過互聯網公開的服務技術。

1

你不同的配置客戶端綁定和服務方面。
嘗試在兩邊使用相同的綁定配置,並查看異常是否消失。

編輯: 也必須提供在服務端用於客戶端認證的證書。

// Provide client credentials 
NetworkCredential credentials = new NetworkCredential("UserName", "RealPasswordHere", "DomainOrMachineName"); 

// Create factory that will be used to create proxy to the service 
// Pass the client credentials into the factory 
var factory = new ChannelFactory<AshService.IDataCollector>("WSDualHttpBinding_IDataCollector"); 
factory.Credentials.Windows.ClientCredential = credentials; 

// Create and open proxy to the service 
AshService.IDataCollector proxy = factory.CreateChannel(); 
(proxy as IChannel).Open(); 

// Invoke an operation from the service 
+0

你能否進一步解釋這一點嗎? – user589195 2011-02-11 13:08:44

1

試試這個

svc.ClientCredentials.Windows.ClientCredential.UserName = "username"; 
svc.ClientCredentials.Windows.ClientCredential.Password = "password";