2012-01-09 21 views
8

Sono in grado di connettersi al servizio WCF con l'applicazione Win-form, tuttavia non sono in grado di farlo con il servizio Windows. Ogni volta che fuoco aperto() per il proxy getta il seguente erroreIl server ha rifiutato le credenziali del client, WCF come servizio Windows

Il server ha rifiutato le credenziali del client

interno Eccezione: System.Security.Authentication.InvalidCredentialException: Il server ha respinto le credenziali del client .
---> System.ComponentModel.Win32Exception: Il tentativo di accesso non è riuscito
--- Fine dell'analisi dello stack eccezione interna ---
a System.Net.Security.NegoState.ProcessAuthentication (LazyAsyncResult lazyResult)
a System.Net.Security.NegotiateStream.AuthenticateAsClient (NetworkCredential credenziali, vincolante ChannelBinding, String targetName, ProtectionLevel requiredProtectionLevel, TokenImpersonationLevel allowedImpersonationLevel)
a System.Net.Security.NegotiateStream.AuthenticateAsClient (NetworkCredential credenziali, String targetName, Protect ionLevel requiredProtectionLevel, TokenImpersonationLevel allowedImpersonationLevel)
a System.ServiceModel.Channels.WindowsStreamSecurityUpgradeProvider.WindowsStreamSecurityUpgradeInitiator.OnInitiateUpgrade (Stream flusso, SecurityMessageProperty & remoteSecurity)

provato a cercare la soluzione, ma nessuno raccordo mie esigenze, da qui postato.

Si prega di aiuto ...

Update 1:.

@ A.R, Provato utilizzando

client.ClientCredentials.Windows.AllowedImpersonationLevel = 
    System.Security.Principal.TokenImpersonationLevel.Impersonation; 

ma senza alcun risultato.

Aggiornamento 2:

Configurazione servizio WCF

<system.serviceModel> 
    <diagnostics performanceCounters="All" /> 
    <bindings> 
     <netTcpBinding> 
     <binding name="myBindingForLargeData" maxReceivedMessageSize="5242880" maxConnections="10"> 
      <readerQuotas maxDepth="64" maxStringContentLength="5242880" maxArrayLength="16384" 
         maxBytesPerRead="4096" maxNameTableCharCount="16384"/> 
     </binding> 
     </netTcpBinding> 
    </bindings> 
    <services> 
     <service behaviorConfiguration="WCFService.ServiceBehavior" 
     name="WCFService.CollectorService"> 
     <endpoint address="" binding="netTcpBinding" bindingConfiguration="myBindingForLargeData" 
      name="netTcpEndPoint" contract="WCFService.ICollectorService" /> 
     <endpoint address="mex" binding="mexTcpBinding" bindingConfiguration="" 
      name="mexTcpEndPoint" contract="IMetadataExchange" /> 
     <host> 
      <baseAddresses> 
      <add baseAddress="net.tcp://localhost:8010/WCFService.CollectorService/" /> 
      </baseAddresses> 
     </host> 
     </service> 
    </services> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior name="WCFService.ServiceBehavior"> 
      <serviceMetadata httpGetEnabled="False"/> 
      <serviceDebug includeExceptionDetailInFaults="True" /> 
      <serviceThrottling 
      maxConcurrentCalls="32" 
      maxConcurrentSessions="32" 
      maxConcurrentInstances="32" 
      /> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
</system.serviceModel> 

risposta

4

Grazie per tutto il vostro aiuto. ho la risposta dopo alcuni giorni di qualche ricerca e metodo di prova n error :) beh so che sono in ritardo per pubblicare la risposta, ma penso che sia meglio tardi che mai.

Quindi, ecco la soluzione

ho dovuto fare alcuni cambiamenti nel mio file di configurazione (sia client server &)

Sul lato client ho aggiunto <security> tag come illustrato di seguito

<system.serviceModel> 
    <bindings> 
     <netTcpBinding> 
     <binding name="netTcpEndPoint" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:10:00" transactionFlow="false" transferMode="Buffered" transactionProtocol="OleTransactions" hostNameComparisonMode="StrongWildcard" listenBacklog="10" maxBufferPoolSize="5242880" maxBufferSize="5242880" maxConnections="15" maxReceivedMessageSize="5242880"> 
      <readerQuotas maxDepth="32" maxStringContentLength="5242880" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
      <reliableSession ordered="true" inactivityTimeout="00:10:00" enabled="false" /> 
     <security mode="Transport"> 
      <transport clientCredentialType="Windows" protectionLevel="EncryptAndSign" /> 
      <message clientCredentialType="Windows" /> 
      </security> 
     </binding> 
     </netTcpBinding> 
    </bindings> 
    <client> 
     <endpoint address="net.tcp://xx.xx.xx.xx:8010/WCFService.CollectorService/" binding="netTcpBinding" bindingConfiguration="netTcpEndPoint" contract="CloudAdapter.CloudCollectorService.ICollectorService" name="netTcpEndPoint"> 
     </endpoint> 
    </client> 
    </system.serviceModel> 

e ha anche aggiunto lo stesso tag sul lato server (configurazione del servizio WCF), come mostrato sotto

<bindings> 
    <netTcpBinding> 
    <binding name="myBindingForLargeData" maxReceivedMessageSize="5242880" maxConnections="10"> 
     <readerQuotas maxDepth="64" maxStringContentLength="5242880" maxArrayLength="16384" 
        maxBytesPerRead="4096" maxNameTableCharCount="16384"/> 
     <security mode="Transport"> 
     <transport clientCredentialType="Windows" protectionLevel="EncryptAndSign" /> 
     <message clientCredentialType="Windows" /> 
     </security> 
    </binding> 
    </netTcpBinding> 
</bindings> 

Spero che questo aiuto una persona bisognosa :)

così la chiave è quello di rendere il tag <security> stessa nel file di configurazione del server client e.

4

Fondamentalmente ciò che sta accadendo è che il vostro servizio di chiamate non ha le credenziali appropriate, come si avrebbe quando si chiama WinForms. Ciò di cui hai bisogno è una rappresentazione. Ci vuole un po 'di configurazione, ed è un po' fastidioso, ma funzionerà.

Per fortuna MSDN ha una bella piccola soluzione.
http://msdn.microsoft.com/en-us/library/ms731090.aspx

Ci sono alcune informazioni più generali sul tema qui:
http://msdn.microsoft.com/en-us/library/ms730088.aspx

UPDATE:
Impostazione bandiere di rappresentazione non è sufficiente. Devi effettivamente impersonare una credenziale per farlo funzionare.Ad esempio:

// Let's assume that this code is run inside of the calling service. 
    var winIdentity = ServiceSecurityContext.Current.WindowsIdentity; 
    using (var impContext = winIdentity.Impersonate()) 
    { 
    // So this would be the service call that is failing otherwise. 
    return MyService.MyServiceCall(); 
    } 
+0

Aggiornato la domanda si prega di controllare – Bravo

+0

OK, devi effettivamente dire chi è impersonare. Non puoi semplicemente impostare la bandiera e aspettarti che impersoni magicamente qualcuno. Leggi i materiali presentati nel secondo link. –

1

Qual è la modalità di autenticazione che si sta utilizzando nel servizio WCF? Sembra che l'app winform sia in esecuzione e fornisca le credenziali corrette mentre il servizio Windows non è in esecuzione con i privilegi specificati o le credenziali passate non sono valide. Prova a ispezionare la tua richiesta usando Fiddler quando hai creato il tuo winforms vs Windwos e vedi la differenza.

+0

ho provato a eseguire il debug del mio servizio Windows e ho trovato l'errore sopra quando provo ad aprire una connessione al client del servizio. BTW cos'è Fiddler ed è utile nel mio tipo di scenario, dove ho un servizio WCF con il binding net.tcp. per favore fatemi sapere – Bravo

+0

non ho implementato alcuna sicurezza implicitamente sul servizio WCF. potrebbe essere un'implementazione di sicurezza predefinita. – Bravo

+0

@Bravo: Fiddler è uno strumento che controlla il traffico in entrata e in uscita sulla rete. Dalla configurazione sopra il servizio utilizza net.Tcp. Posso sapere se è ospitato in IIS o self hosted? Anche il tuo servizio Windows su una macchina diversa? – Rajesh

1

Controlla la mia risposta su questo post The server has rejected the client credentials.

Annotare il nodo di sicurezza.

<bindings> 
    <netTcpBinding> 
    <binding name="customTcpBinding" maxReceivedMessageSize="20480000" transferMode="Streamed" > 
     <security mode="None"></security> 
    </binding> 
    </netTcpBinding> 
</bindings> 
+1

Questo ha funzionato per me –

Problemi correlati