Exportar (0) Imprimir
Expandir todo
Este artículo se tradujo de forma manual. Mueva el puntero sobre las frases del artículo para ver el texto original. Más información.
Traducción
Original

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 obtener más información sobre cómo crear un servicio seguro, vea Seguridad de servicios.

De forma predeterminada, los enlaces WCF tienen características de seguridad habilitadas. (La excepción es el 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.

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 extremo de intercambio de metadatos (MEX) o pone sus metadatos a disposición sobre HTTP o HTTPS, puede descargar los metadatos mediante Herramienta de utilidad de metadatos de ServiceModel (Svcutil.exe), que genera ambos archivos de código para un cliente, así como un archivo de configuración. (Para obtener más información sobre el uso de la herramienta, vea Acceso a los servicios mediante un cliente WCF.) Si el servicio no publica un extremo MEX y 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.

Nota importante 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.

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 él o ella podrán 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.

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

  1. Determine el tipo de credencial de cliente que requiere el servicio. 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 un 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 emitido por una entidad de certificación en la que el servicio confíe.

ms731094.collapse_all(es-es,VS.110).gifDeterminación del tipo de credencial de cliente

Si tiene el archivo de configuración que generó la herramienta Svcutil.exe, examine la sección <bindings> 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><transport> puede contener un elemento <message> o , 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>"Certificate" es. 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>

ms731094.collapse_all(es-es,VS.110).gifEstablecimiento 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>clientCredentials del archivo de configuración para el cliente y utilizando el elemento (se muestra abajo).

ms731094.collapse_all(es-es,VS.110).gifEstableciendo un valor <clientCredentials> en código

Para establecer un valor <clientCredentials>ClientCredentials en código, debe obtener acceso a la propiedad ClientBase<TChannel> de la clase. 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.

ms731094.collapse_all(es-es,VS.110).gifEstableciendo un valor <clientCredentials> mediante configuración

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

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

Para establecer la credencial del cliente mediante configuración, agregue un elemento <endpointBehaviors> al archivo de configuración.Además, el elemento de comportamiento agregado se debe vincular al extremo del servicio utilizando el atributo behaviorConfiguration del elemento <endpoint> tal y 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>

NotaNota

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 obtener más información sobre establecimiento de la credencial de cliente, vea Cómo: Especificar los valores de credenciales de cliente.

NotaNota

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>

Adiciones de comunidad

AGREGAR
Mostrar:
© 2014 Microsoft