2012-01-09 38 views
8

Puedo conectarme a mi servicio WCF con la aplicación Win-form, sin embargo, no puedo hacerlo con mi servicio de Windows. Siempre que yo fuego abierto() al proxy que arroja el siguiente errorEl servidor ha rechazado las credenciales del cliente, WCF como servicio de Windows

El servidor ha rechazado las credenciales del cliente

excepción interna: System.Security.Authentication.InvalidCredentialException: El servidor ha rechazado las credenciales del cliente .
---> System.ComponentModel.Win32Exception: El intento de inicio de sesión no
--- Final de seguimiento de pila de excepción ---
en System.Net.Security.NegoState.ProcessAuthentication (LazyAsyncResult lazyResult)
en System.Net.Security.NegotiateStream.AuthenticateAsClient (NetworkCredential credencial, ChannelBinding de unión, de cadena targetName, ProtectionLevel requiredProtectionLevel, TokenImpersonationLevel allowedImpersonationLevel)
en System.Net.Security.NegotiateStream.AuthenticateAsClient (NetworkCredential credencial, cadena targetName, Protect ionLevel requiredProtectionLevel, TokenImpersonationLevel allowedImpersonationLevel)
en System.ServiceModel.Channels.WindowsStreamSecurityUpgradeProvider.WindowsStreamSecurityUpgradeInitiator.OnInitiateUpgrade (Corriente corriente, SecurityMessageProperty & remoteSecurity)

intentado buscar la solución, pero ninguno ajuste a mis necesidades, por lo tanto, al corriente.

Por favor, ayuda ...

Actualización 1:.

@ A.R., intentado usar

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

pero fue en vano.

Actualización 2:

configuración de servicio 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> 

Respuesta

4

Gracias por su ayuda. recibí la respuesta después de algunos días de algún método de investigación y ensayo n error :) bueno, sé que llego tarde para publicar la respuesta, pero creo que es mejor tarde que nunca.

Así que aquí está la solución

que tenía que hacer algunos cambios en mis archivos de configuración (tanto el cliente & servidor)

En el lado del cliente i added <security> etiqueta como se muestra a continuación

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

y también agregó la misma etiqueta en el lado del servidor (configuración del servicio WCF), como se muestra a continuación

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

Esperanza esta ayuda a una persona en necesidad :)

Así que la clave es hacer que la etiqueta <security> igual durante el los archivos de configuración del servidor y cliente.

4

Básicamente lo que ocurre es que su servicio de llamadas no tiene las credenciales apropiadas, como la que tendría si se llama desde Windows Forms. Lo que necesitas es una personificación. Requiere un poco de configuración, y es un poco molesto, pero funcionará.

Afortunadamente, MSDN tiene un pequeño y agradable tutorial.
http://msdn.microsoft.com/en-us/library/ms731090.aspx

Hay alguna información más general sobre el tema aquí:
http://msdn.microsoft.com/en-us/library/ms730088.aspx

ACTUALIZACIÓN:
banderas de suplantación ajuste no es suficiente. En realidad, debes suplantar una credencial para que funcione.Por ejemplo:

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

Se ha actualizado la pregunta, por favor marque – Bravo

+0

OK, tiene que decirle realmente a quién debe suplantar. No puedes simplemente configurar la bandera y esperar que se haga pasar por otra persona mágicamente. Lea los materiales presentados en el segundo enlace. –

1

¿Cuál es el modo de autenticación que está utilizando en su servicio WCF? Parece que la aplicación winform se está ejecutando y proporciona las credenciales correctas mientras el servicio de Windows no se está ejecutando con los privilegios especificados o las credenciales que se pasan no son válidas. Intente inspeccionar su solicitud utilizando Fiddler cuando esté hecho de sus winforms vs servicio de Windwos y vea la diferencia.

+0

intenté depurar mi servicio de Windows y encontré el error anterior cuando intento abrir una conexión con el cliente del Servicio. Por cierto, qué es Fiddler y es útil en mi tipo de escenario, donde tengo un servicio WCF con enlace net.tcp. por favor, hágamelo saber – Bravo

+0

no he implementado ninguna seguridad implícita en el servicio WCF. podría ser una implementación de seguridad predeterminada. – Bravo

+0

@Bravo: Fiddler es una herramienta que inspecciona el tráfico entrante y saliente a través de la red. Desde la configuración anterior, el servicio usa net.Tcp. ¿Puedo saber si está alojado en IIS o alojado en uno mismo? ¿También está su servicio de Windows en una máquina diferente? – Rajesh

1

Mira mi respuesta en esta entrada The server has rejected the client credentials.

Tenga en cuenta el nodo de seguridad.

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

Esto funcionó para mí –

Cuestiones relacionadas