Pregunta

Tengo dos servicios WCF en la misma máquina. Uno es el editor y el otro es el oyente.

El publicador está creando dinámicamente servidores proxy basados ??en un punto final. Estoy configurando el proxy en un código como este:

            WSHttpBinding binding = new WSHttpBinding(SecurityMode.Message, true);
            binding.Security.Message.NegotiateServiceCredential = true;
            binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Windows;
            binding.Security.Transport.ProxyCredentialType = HttpProxyCredentialType.None;
            binding.Security.Message.ClientCredentialType = MessageCredentialType.Windows;
            binding.Security.Message.EstablishSecurityContext = true;
            binding.ReliableSession.Enabled = true;
            binding.TransactionFlow = true;
            return binding;

y luego ...

            Binding binding = GetBindingFromAddress(address);

            ChannelFactory<T> factory = new ChannelFactory<T>(binding);
            factory.Credentials.UserName.UserName = "an account on the machine";
            factory.Credentials.UserName.Password = "a password for that account";

            T proxy = factory.CreateChannel(new EndpointAddress(address));

Cuando voy a hacer mi llamada, recibo el error anterior. Aquí está mi archivo de configuración de escucha:

   <service behaviorConfiguration="MEX Enabled" name="InvoiceSubscriber">
<endpoint binding="wsHttpBinding"
          bindingConfiguration="ReliableTransactionalHTTP"
          contract="AtlanticBT.SubscriptionService.Contracts.v1.IAtlanticEvents">
 <identity>
  <dns value="localhost" />
 </identity>
</endpoint>

        <bindings>
        <wsHttpBinding>
            <binding name="ReliableTransactionalHTTP" transactionFlow="true">
                <reliableSession enabled="true"/>
      <security mode="Message">
        <transport clientCredentialType="Windows" proxyCredentialType="None" realm=""/>
        <message clientCredentialType="Windows" negotiateServiceCredential="true" 
                 algorithmSuite="Default" establishSecurityContext="true"/>
      </security>
            </binding>
  </wsHttpBinding>
    </bindings>

He verificado todas mis ACL en los directorios que alojan los servicios y parecen ser correctos. La seguridad de IIS está configurada para acceso anónimo y autenticación de Windows.

Entonces, si configuro explícitamente las credenciales en el código, ¿por qué mi oyente no puede autenticarse?

¿Fue útil?

Solución

Primero, este mensaje generalmente significa que las máquinas no están en el mismo dominio y, por lo tanto, no pueden comunicarse utilizando la seguridad de Windows. ¿Los dos servidores están en el mismo dominio?

Segundo, ha configurado su punto final para usar la seguridad de Windows. Utiliza la seguridad de Windows no solo a nivel de mensaje, sino a nivel de transporte. Ambos parecen excesivos, probablemente solo quieras hacer transporte.

Tercero, todo lo que ha configurado dice "Quiero usar la autenticación de Windows", pero luego está configurando las propiedades de UsernameClientCredentials de ClientCredentials. Esas propiedades solo se usan para la seguridad del token de nombre de usuario, no para Windows. La seguridad de Windows tomará la identidad del hilo actual y la reenviará.

Suponiendo que su intención era usar la seguridad de Windows, entonces necesita:

  1. Ejecute su proceso de editor con una sola identidad de Windows con la que desea que se comunique con los suscriptores como.
  2. Utilice la suplantación dentro del proceso del editor para cambiar el contexto de seguridad de cada llamada (consulte WindowsIdentity.Suprsonate para más información)

En este momento técnicamente está haciendo el # 1, incluso si cree que está haciendo el # 2 al configurar las propiedades de nombre de usuario / contraseña, ya que se ignoran.

Finalmente, aquí hay una buena documentación sobre cómo configurar sus enlaces para diferentes tipos de escenarios de autenticación de Windows:


Más allá de esto, no estoy seguro de qué más puedo dar sin más información de usted. Si revisa su pregunta para proporcionar más información / responder algunas de mis preguntas, con gusto revisaré mi respuesta para que sea más útil.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top