Compartir a través de


Ejemplo de seguridad de mensajes

El ejemplo MessageSecurity muestra cómo implementar una aplicación que usa la seguridad de mensajes basicHttpBinding y . Este ejemplo se basa en la Guía de inicio que implementa un servicio de calculadora.

Nota:

El procedimiento de instalación y las instrucciones de compilación de este ejemplo se encuentran al final de este tema.

El modo de seguridad de basicHttpBinding se puede establecer en los siguientes valores: Message, Transport, TransportCredentialOnlyTransportWithMessageCredentialy None. En el siguiente archivo de App.config de servicio de ejemplo, la definición de punto de conexión especifica el basicHttpBinding y hace referencia a una configuración de enlace denominada Binding1, como se muestra en la siguiente configuración de ejemplo:

<system.serviceModel>
  <services>
    <service name="Microsoft.ServiceModel.Samples.CalculatorService"
             behaviorConfiguration="CalculatorServiceBehavior">
     <!-- This endpoint is exposed at the base address provided by -->
     <!-- host: http://localhost:8000/ServiceModelSamples/service.-->
     <endpoint address=""
               binding="basicHttpBinding"
               bindingConfiguration="Binding1"
               contract="Microsoft.ServiceModel.Samples.ICalculator" />
    </service>
  </services>
  ...
</system.serviceModel>

La configuración de enlace establece el mode atributo de la <seguridad>Message en y establece el clientCredentialType atributo del <mensaje>Certificate como se muestra en la siguiente configuración de ejemplo:

<bindings>
  <basicHttpBinding>
    <!--
        This configuration defines the SecurityMode as Message and
        the clientCredentialType as Certificate.
        -->
    <binding name="Binding1" >
      <security mode = "Message">
        <message clientCredentialType="Certificate"/>
      </security>
    </binding>
  </basicHttpBinding>
</bindings>

El certificado que el servicio usa para autenticarse en el cliente se establece en la sección de comportamientos del archivo de configuración en el serviceCredentials elemento . El modo de validación que se aplica al certificado que el cliente usa para autenticarse en el servicio también se establece en la sección clientCertificate de comportamientos del elemento .

<!--For debugging purposes, set the includeExceptionDetailInFaults attribute to true.-->
<behaviors>
  <serviceBehaviors>
    <behavior name="CalculatorServiceBehavior">
      <serviceMetadata httpGetEnabled="True"/>
      <serviceDebug includeExceptionDetailInFaults="False" />
      <!--The serviceCredentials behavior allows one to define a -->
      <!--service certificate. A service certificate is used by a -->
      <!--client to authenticate the service and provide message -->
      <!-- protection. This configuration references the "localhost"-->
      <!--certificate installed during the setup instructions. -->
      <serviceCredentials>
        <serviceCertificate findValue="localhost"
               storeLocation="LocalMachine"
               storeName="My" x509FindType="FindBySubjectName" />
        <clientCertificate>
          <!-- Setting the certificateValidationMode to -->
          <!-- PeerOrChainTrust means that if the certificate -->
          <!--is in the user's Trusted People store, then it is -->
          <!-- trusted without performing a validation of the -->
          <!-- certificate's issuer chain. This setting is used -->
          <!-- here for convenience so that the sample can be run -->
          <!-- without having to have certificates issued by a -->
          <!-- certification authority (CA). -->
          <!-- This setting is less secure than the default, -->
          <!-- ChainTrust. The security implications of this -->
          <!-- setting should be carefully considered before using -->
          <!-- PeerOrChainTrust in production code. -->
          <authentication
                       certificateValidationMode="PeerOrChainTrust" />
        </clientCertificate>
      </serviceCredentials>
    </behavior>
  </serviceBehaviors>
</behaviors>

Los mismos detalles de enlace y seguridad se especifican en el archivo de configuración del cliente.

La identidad del autor de la llamada se muestra en la ventana de la consola de servicio mediante el código siguiente:

Console.WriteLine("Called by {0}", ServiceSecurityContext.Current.PrimaryIdentity.Name);

Al ejecutar el ejemplo, las solicitudes de operación y las respuestas se muestran en la ventana de la consola del cliente. Presione ENTRAR en la ventana del cliente para apagar el cliente.

Add(100,15.99) = 115.99
Subtract(145,76.54) = 68.46
Multiply(9,81.25) = 731.25
Divide(22,7) = 3.14285714285714
Press <ENTER> to terminate client.

Para instalar y compilar el ejemplo

  1. Asegúrese de que ha realizado el procedimiento de instalación única para los ejemplos de Windows Communication Foundation.

  2. Para compilar el código C# o Visual Basic .NET Edition de la solución, siga las instrucciones de Building the Windows Communication Foundation Samples.

Para ejecutar el ejemplo en la misma máquina

  1. Ejecute Setup.bat desde la carpeta de instalación de ejemplo. Esto instala todos los certificados necesarios para ejecutar el ejemplo.

    Nota:

    El archivo por lotes Setup.bat está diseñado para ejecutarse desde una consola de comandos del Windows SDK. Requiere que la variable de entorno MSSDK apunte al directorio donde está instalado el SDK. Esta variable de entorno se establece automáticamente dentro de un símbolo del sistema de Windows SDK.

  2. Ejecute la aplicación de servicio desde \service\bin.

  3. Ejecute la aplicación cliente desde \client\bin. La actividad de cliente se muestra en la aplicación de consola cliente.

  4. Si el cliente y el servicio no pueden comunicarse, consulte Sugerencias de solución de problemas para ejemplos de WCF.

  5. Quite los certificados ejecutando Cleanup.bat cuando haya terminado con el ejemplo. Otros ejemplos de seguridad usan los mismos certificados.

Para ejecutar el ejemplo en varias máquinas

  1. Cree un directorio en la máquina de servicio para los archivos binarios de servicio.

  2. Copie los archivos de programa de servicio en el directorio de servicio del servidor. Copie también los archivos Setup.bat, Cleanup.baty ImportClientCert.bat en el servidor.

  3. Cree un directorio en el equipo cliente para los archivos binarios de cliente.

  4. Copie los archivos de programa cliente en el directorio de cliente en el equipo cliente. Copie también los archivos Setup.bat, Cleanup.baty ImportServiceCert.bat en el cliente.

  5. En el servidor, ejecute setup.bat service. La ejecución setup.bat con el service argumento crea un certificado de servicio con el nombre de dominio completo de la máquina y exporta el certificado de servicio a un archivo denominado Service.cer.

  6. Edite Service.exe.config para reflejar el nuevo nombre de certificado (en el findValue atributo del <elemento serviceCertificate> ), que es el mismo que el nombre de dominio completo del equipo. Cambie también el valor de la dirección base para especificar un nombre de equipo completo en lugar de localhost..

  7. Copie el archivo Service.cer del directorio de servicio en el directorio cliente del equipo cliente.

  8. En el cliente, ejecute setup.bat client. Al ejecutar setup.bat con el argumento client, se crea un certificado de cliente denominado client.com y se exporta el certificado de cliente a un archivo denominado Client.cer.

  9. En el archivo Client.exe.config del equipo cliente, cambie el valor de dirección del punto de conexión para que coincida con la nueva dirección del servicio. Para ello, reemplace localhost por el nombre de dominio completo del servidor. Cambie también el findValue atributo de <defaultCertificate> por el nuevo nombre de certificado de servicio que es el nombre de dominio completo del servidor.

  10. Copie el archivo Client.cer del directorio cliente en el directorio de servicio del servidor.

  11. En el cliente, ejecute ImportServiceCert.bat. Así se importa el certificado del servicio del archivo Service.cer en el almacén CurrentUser - TrustedPeople.

  12. En el servidor, ejecute ImportClientCert.bat; esto importará el certificado de cliente del archivo Client.cer en el almacén LocalMachine - TrustedPeople.

  13. En el equipo de servicio, ejecute Service.exe desde un símbolo del sistema.

  14. En el equipo cliente, inicie Client.exe desde una ventana de comandos.

    1. Si el cliente y el servicio no pueden comunicarse, consulte Sugerencias de solución de problemas para ejemplos de WCF.

Para limpiar después de la muestra.

  • Ejecute Cleanup.bat en la carpeta samples una vez que haya terminado de ejecutar el ejemplo.

    Nota:

    Este script no quita certificados de servicio en un cliente al ejecutar este ejemplo entre máquinas. Si ha ejecutado ejemplos de Windows Communication Foundation (WCF) que usan certificados entre máquinas, asegúrese de borrar los certificados de servicio que se han instalado en el almacén CurrentUser - TrustedPeople. Para ello, use el siguiente comando: Por ejemplo: certmgr -del -r CurrentUser -s TrustedPeople -c -n <Fully Qualified Server Machine Name>certmgr -del -r CurrentUser -s TrustedPeople -c -n server1.contoso.com