Protección de clientes

En Windows Communication Foundation (WCF), el servicio dicta los requisitos de seguridad para los clientes. Es decir, el servicio especifica qué modo de seguridad utilizar, y si el cliente debe proporcionar una credencial o no. El proceso de protección de un cliente, por consiguiente, es simple: utilice los metadatos obtenidos del servicio (si se publica) y cree un cliente. Los metadatos especifican cómo configurar el cliente. Si el servicio requiere que el cliente suministre una credencial, debe obtener una credencial que se ajuste al requisito. Este tema explica el proceso con más detalle. Para más información sobre cómo crear un servicio seguro, consulte Seguridad de servicios.

El servicio especifica la seguridad

De manera predeterminada, los enlaces de WCF tienen características de seguridad habilitadas. (La excepción es BasicHttpBinding). Por tanto, si el servicio se creó mediante WCF, hay una mayor probabilidad de que implementará la seguridad para asegurar la autenticación, confidencialidad e integridad. En ese caso, los metadatos que proporciona el servicio indicarán lo que se requiere para establecer un canal de comunicación seguro. Si los metadatos del servicio no incluyen ningún requisito de seguridad, no hay ninguna manera de imponer un esquema de seguridad, como Secure Sockets Layer (SSL) sobre HTTP, en un servicio. Si, sin embargo, el servicio requiere que el cliente proporcione una credencial, el desarrollador, implementador o administrador del cliente, debe proporcionar la credencial real que el cliente utilizará para autenticarse en el servicio.

Obtención de los metadatos

Al crear un cliente, el primer paso es obtener los metadatos para el servicio con el que el cliente se comunicará. Esto se puede llevar a cabo de dos maneras. Primero, si el servicio publica un punto de conexión de intercambio de metadatos (MEX) o pone sus metadatos a disposición sobre HTTP o HTTPS, puede descargar los metadatos mediante la herramienta de utilidad de metadatos ServiceModel (Svcutil.exe), que genera ambos archivos de código para un cliente, así como un archivo de configuración. (Para más información sobre el uso de la herramienta, consulte Acceso a los servicios mediante un cliente WCF). Si el servicio no publica un punto de conexión MEX ni tampoco pone sus metadatos a disposición sobre HTTP o HTTPS, debe ponerse en contacto con el creador del servicio para obtener la documentación que describe los requisitos de seguridad y los metadatos.

Importante

Se recomienda que los metadatos procedan de una fuente de confianza y que no se manipulen. Los metadatos recuperados utilizando el protocolo HTTP se envían en texto no cifrado y se pueden manipular. Si el servicio utiliza HttpsGetEnabled y las propiedades HttpsGetUrl, utilice la dirección URL que el creador del servicio proporcionó para descargar los datos mediante el protocolo HTTPS.

Validación de la seguridad

Las fuentes de metadatos pueden dividirse en dos amplias categorías: fuentes de confianza y fuentes que no son de confianza. Si confía en una fuente y se ha descargado el código de cliente y otros metadatos desde ese extremo MEX seguro de la fuente, puede crear el cliente, proporcionarle las credenciales correctas y ejecutarlo sin más preocupaciones.

Sin embargo, si elige descargar un cliente y metadatos desde un origen del que sabe poco, asegúrese de validar la las medidas de seguridad que utiliza el código. Por ejemplo, no debe crear simplemente un cliente que envíe su información personal o financiera a un servicio a menos que el servicio exija confidencialidad e integridad (como mínimo). Debería confiar en el propietario del servicio hasta el punto que esté dispuesto a divulgar tal información porque el propietario podrá ver tal información.

Como regla, por consiguiente, al utilizar código y metadatos desde una fuente que no sea de confianza, compruebe el código y los metadatos para asegurarse de que cumple el nivel de seguridad que requiere.

Establecimiento de una credencial de cliente

El establecimiento de una credencial de cliente en un cliente consta de dos pasos:

  1. Determine el tipo de credencial de cliente que el servicio requiere. Esto se logra mediante uno de los dos métodos de siguientes. Primero, si tiene documentación del creador del servicio, debería especificar el tipo de credencial de cliente (si hubiese) que el servicio requiere. Segundo, si solo tiene un archivo de configuración generado por la herramienta Svcutil.exe, puede examinar los enlaces individuales para determinar qué tipo de credencial se requiere.

  2. Especifique una credencial de cliente real. La credencial de cliente real se denomina valor de credencial de cliente para distinguirla del tipo. Por ejemplo, si el tipo de credencial de cliente especifica un certificado, debe proporcionar un certificado X.509 que emita una entidad de certificación en la que el servicio confíe.

Determinación del tipo de credencial de cliente

Si tiene el archivo de configuración que generó la herramienta Svcutil.exe, examine la sección <enlaces > para determinar qué tipo de credencial de cliente se requiere. Dentro de la sección hay elementos de enlace que especifican los requisitos de seguridad. Específicamente, examine el elemento <security> de cada enlace. Ese elemento incluye el atributo mode, que puede establecer en uno de tres valores posibles (Message, Transporto TransportWithMessageCredential). El valor del atributo determina el modo y el modo determina cuál de los elementos secundarios es significativo.

El elemento <security> puede contener un elemento <transport> o <message>, o ambos. El elemento significativo es el que coincide con el modo de seguridad. Por ejemplo, el siguiente código especifica que el modo de seguridad es "Message", y que el tipo de credencial de cliente para el elemento <message>. En este caso se puede ignorar el elemento <transport>. Sin embargo, el elemento <message> especifica que se debe proporcionar un certificado X.509.

<wsHttpBinding>  
    <binding name="WSHttpBinding_ICalculator">  
       <security mode="Message">  
           <transport clientCredentialType="Windows"
                      realm="" />  
           <message clientCredentialType="Certificate"
                    negotiateServiceCredential="true"  
                    algorithmSuite="Default"
                    establishSecurityContext="true" />  
       </security>  
    </binding>  
</wsHttpBinding>  

Tenga en cuenta que si el atributo clientCredentialType está establecido en "Windows", tal y como se muestra en el ejemplo siguiente, no es necesario proporcionar un valor de credencial real. Esto se debe a que la seguridad integrada de Windows proporciona la credencial real (un token de Kerberos) de la persona que está ejecutando el cliente.

<security mode="Message">  
    <transport clientCredentialType="Windows "
        realm="" />  
</security>  

Establecimiento del valor de credencial de cliente

Si se determina que el cliente debe proporcionar una credencial, utilice el método adecuado para configurar el cliente. Por ejemplo, para establecer un certificado de cliente, utilice el método SetCertificate.

Un formulario común de credencial es el certificado X.509. Puede proporcionar la credencial de dos maneras:

  • Programándolo en su código de cliente (mediante el método SetCertificate ).

Agregando una sección <behaviors> del archivo de configuración para el cliente y utilizando el elemento clientCredentials (se muestra a continuación).

Establecimiento de un valor <clientCredentials> en el código

Para establecer un valor <clientCredentials> en el código, debe acceder a la propiedad ClientCredentials de la clase ClientBase<TChannel>. La propiedad devuelve un objeto ClientCredentials que permite el acceso a varios tipos de credenciales, tal y como se muestra en la tabla siguiente.

Propiedad ClientCredential Descripción Notas
ClientCertificate Devuelve una X509CertificateInitiatorClientCredential. Representa un certificado X.509 proporcionado por el cliente para autenticarse en el servicio.
HttpDigest Devuelve una HttpDigestClientCredential. Representa una credencial de sintaxis de HTTP. La credencial es un hash del nombre de usuario y contraseña.
IssuedToken Devuelve una IssuedTokenClientCredential. Representa un token de seguridad personalizado emitido por un servicio de tokens de seguridad, utilizado normalmente en escenarios de federación.
Peer Devuelve una PeerCredential Representa una credencial del mismo nivel para la participación en una malla del mismo nivel en un dominio de Windows.
ServiceCertificate Devuelve una X509CertificateRecipientClientCredential. Representa un certificado X.509 proporcionado por el servicio en una negociación fuera de banda.
UserName Devuelve una UserNamePasswordClientCredential Representa un par de nombre de usuario y contraseña.
Windows Devuelve una WindowsClientCredential Representa una credencial de cliente de Windows (una credencial de Kerberos). Las propiedades de la clase son de solo lectura.

Establecimiento de un valor <clientCredentials> en la configuración

Los valores de credencial se especifican utilizando un comportamiento de punto de conexión como elementos secundarios del elemento <clientCredentials>. El elemento utilizado depende del tipo de credencial de cliente. Por ejemplo, en el ejemplo siguiente se muestra la configuración para establecer un certificado X.509 mediante <<clientCertificate>.

<configuration>  
  <system.serviceModel>  
    <behaviors>  
      <endpointBehaviors>
        <behavior name="myEndpointBehavior">  
          <clientCredentials>  
            <clientCertificate findvalue="myMachineName"
            storeLocation="Current" X509FindType="FindBySubjectName" />  
          </clientCredentials>  
        </behavior>
      </endpointBehaviors>
    </behaviors>
  </system.serviceModel>  
</configuration>  

Para establecer la credencial de cliente en la configuración, agregue un elemento <endpointBehaviors> al archivo de configuración. Además, el elemento de comportamiento agregado se debe vincular al punto de conexión del servicio mediante el atributo behaviorConfiguration del <punto de conexión> del elemento <client>, tal como se muestra en el ejemplo siguiente. El valor del atributo behaviorConfiguration debe coincidir con el valor del atributo name del comportamiento.

<configuration>
  <system.serviceModel>
    <client>
      <endpoint address="http://localhost/servicemodelsamples/service.svc"
                binding="wsHttpBinding"
                bindingConfiguration="Binding1"
                behaviorConfiguration="myEndpointBehavior"
                contract="Microsoft.ServiceModel.Samples.ICalculator" />
    </client>
  </system.serviceModel>
</configuration>

Nota

Algunos de los valores de credenciales de cliente no se pueden establecer utilizando los archivos de configuración de la aplicación, por ejemplo, el nombre de usuario y la contraseña, o los valores de usuario y contraseña de Windows. Tales valores de credenciales solo se pueden especificarse mediante código.

Para más información sobre cómo establecer la credencial de cliente, consulte Cómo especificar los valores de credenciales de cliente.

Nota

Se omite ClientCredentialType cuando SecurityMode está establecido en "TransportWithMessageCredential", tal y como se muestra en la configuración del ejemplo siguiente.

<wsHttpBinding>  
    <binding name="PingBinding">  
        <security mode="TransportWithMessageCredential"  >  
           <message  clientCredentialType="UserName"
               establishSecurityContext="false"
               negotiateServiceCredential="false" />  
           <transport clientCredentialType="Certificate"  />  
         </security>  
    </binding>  
</wsHttpBinding>  

Consulte también