Compartir a través de


Seguridad de los mensajes con un cliente de Windows sin negociación de credenciales

El escenario siguiente muestra un cliente y un servicio Windows Communication Foundation (WCF) protegidos por el protocolo Kerberos.

Tanto el servicio como el cliente están en el mismo dominio, o dominios, de confianza.

Nota

La diferencia entre este escenario y Seguridad del mensaje con un cliente de Windows, es que este escenario no negocia la credencial del servicio con el servicio antes de enviar el mensaje de la aplicación. Además, debido a la necesidad del protocolo Kerberos, este escenario requiere un entorno de dominio de Windows.

Seguridad de mensajes sin negociación de credenciales

Característica Descripción

Modo de seguridad

Mensaje

Interoperabilidad

Sí, WS-Security con clientes Kerberos compatibles con el perfil del token

Autenticación (servidor)

Autenticación mutua del servidor y el cliente

Autenticación (cliente)

Autenticación mutua del servidor y el cliente

Integridad

Confidencialidad

Transporte

HTTP

Enlace

WSHttpBinding

Servicio

El código y la configuración siguientes están diseñados para ejecutarse de forma independiente. Siga uno de los procedimientos siguientes:

  • Cree un servicio independiente mediante el código sin configuración.
  • Cree un servicio mediante la configuración proporcionada, pero sin definir ningún extremo.

Código

El código siguiente crea un extremo de servicio que utiliza el modo de seguridad. El código deshabilita la negociación de la credencial de servicio, y el establecimiento de un token de contexto de seguridad (SCT).

Nota

Para utilizar el tipo de credencial de Windows sin negociación, la cuenta de usuario del servicio debe tener acceso al nombre principal de servicio (SPN) registrado en el dominio de Active Directory. Esto se puede realizar de dos formas:

  1. Utilice el NetworkService, o la cuenta LocalSystem, para ejecutar el servicio. Dado que esas cuentas tienen acceso al SPN del equipo, establecido cuando el equipo se une al dominio de Active Directory, WCF genera automáticamente el elemento SPN apropiado en los metadatos del extremo del servicio (Lenguaje de descripción de servicios web o WSDL).
  2. Utilice una cuenta de dominio arbitraria de Active Directory para ejecutar el servicio. En este caso, es necesario establecer un SPN para esa cuenta de dominio. Una manera de hacerlo es utilizar la herramienta de la utilidad Setspn.exe. Una vez creado el SPN para la cuenta del servicio, configure WCF para publicar ese SPN a los clientes del servicio a través de sus metadatos (WSDL). Esto se consigue estableciendo la identidad del extremo expuesto, mediante un archivo de configuración de la aplicación o el código. El siguiente ejemplo publica la identidad mediante programación.

Para obtener más información acerca de SPN, el protocolo Kerberos y Active Directory, vea el Suplemento técnico Kerberos para Windows. Para obtener más información acerca de las identidades del extremo, vea Modos de autenticación de SecurityBindingElement.

Configuración

En lugar del código, se puede utilizar la siguiente configuración.

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.serviceModel>
    <behaviors />
    <services>
      <service behaviorConfiguration="" name="ServiceModel.Calculator">
        <endpoint address="https://localhost/Calculator" 
                  binding="wsHttpBinding"
                  bindingConfiguration="KerberosBinding"
                  name="WSHttpBinding_ICalculator"
                  contract="ServiceModel.ICalculator" 
                  listenUri="net.tcp://localhost/metadata" >
         <identity>
            <servicePrincipalName value="service_spn_name" />
         </identity>
        </endpoint>
      </service>
    </services>
    <bindings>
      <wsHttpBinding>
        <binding name="KerberosBinding">
          <security>
            <message negotiateServiceCredential="false" 
                     establishSecurityContext="false" />
          </security>
        </binding>
      </wsHttpBinding>
    </bindings>
    <client />
  </system.serviceModel>
</configuration>

Cliente

El código y la configuración siguientes están diseñados para ejecutarse de manera independiente. Realice uno de los procedimientos siguientes:

  • Cree un cliente independiente mediante el código (y el código de cliente).
  • Cree un cliente que no defina direcciones de extremo. En su lugar, utilice el constructor de cliente que adopta el nombre de configuración como un argumento. Por ejemplo:

Código

El siguiente código configura el cliente. El modo de seguridad se establece en mensaje, y el tipo de credencial de cliente se establece en Windows. Tenga en cuenta que las propiedades NegotiateServiceCredential y EstablishSecurityContext se establecen en false.

Nota

Para utilizar el tipo de credencial de Windows sin negociación, el cliente debe configurarse con el SPN de la cuenta del servicio, antes de iniciar la comunicación con el servicio. El cliente utiliza el SPN para obtener el token de Kerberos para autenticar y proteger la comunicación con el servicio. El ejemplo siguiente muestra cómo configurar el cliente con el SPN del servicio. Si está utilizando ServiceModel Metadata Utility Tool (Svcutil.exe) para generar el cliente, el SPN del servicio se propagará automáticamente al cliente desde los metadatos del servicio (WSDL), si los metadatos del servicio contienen esa información. Para obtener más información acerca de cómo configurar el servicio para incluir el SPN en los metadatos del servicio, vea la sección "Servicio" incluida en este tema.

Para obtener más información acerca de SPN, Kerberos, y Active Directory, consulte https://go.microsoft.com/fwlink/?LinkId=88330. Para obtener más información acerca de las identidades de extremo, consulte el tema Modos de autenticación de SecurityBindingElement.

Configuración

El siguiente código configura el cliente. Tenga en cuenta que el elemento <ServicePrincipalName> debe establecerse de forma que coincida con el SPN del servicio tal y como se registró para la cuenta del servicio en el dominio de Active Directory.

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.serviceModel>
    <bindings>
      <wsHttpBinding>
        <binding name="WSHttpBinding_ICalculator" >
          <security mode="Message">
            <message clientCredentialType="Windows" 
                     negotiateServiceCredential="false"
                     establishSecurityContext="false" />
          </security>
        </binding>
      </wsHttpBinding>
    </bindings>
    <client>
      <endpoint address="https://localhost/Calculator" 
                binding="wsHttpBinding"
                bindingConfiguration="WSHttpBinding_ICalculator"
                contract="ICalculator"
                name="WSHttpBinding_ICalculator">
        <identity>
          <servicePrincipalName value="service_spn_name" />
        </identity>
      </endpoint>
    </client>
  </system.serviceModel>
</configuration>

Consulte también

Conceptos

Información general sobre seguridad
Identidad del servicio y autenticación