Procedimiento para proteger puntos de conexión de metadatos

Los metadatos para un servicio pueden contener información confidencial sobre su aplicación que un usuario malintencionado puede aprovechar. Los consumidores de su servicio también pueden requerir un mecanismo seguro para obtener los metadatos sobre su servicio. Por consiguiente, a veces es necesario publicar sus metadatos utilizando un extremo seguro.

Los puntos de conexión de metadatos generalmente se protegen utilizando mecanismos de seguridad estándar definidos en Windows Communication Foundation (WCF) para proteger los puntos de conexión de la aplicación. Para más información, consulte Introducción a la seguridad.

En este tema se describen los pasos para crear un extremo protegido por un certificado SSL (Capa de sockets seguros) o, en otras palabras, un extremo de HTTPS.

Para crear un extremo seguro de metadatos HTTPS GET en código

  1. Configure un puerto con un certificado X.509 adecuado. El certificado debe proceder de una entidad de confianza y debe tener un uso previsto de "Autorización de servicio". Debe usar la herramienta HttpCfg.exe para asociar el certificado al puerto. Consulte Configuración de un puerto con un certificado SSL.

    Importante

    El asunto del certificado o su Domain Name System (DNS) debe coincidir con el nombre del equipo. Esto es esencial porque uno de los primeros pasos que el mecanismo de HTTPS realiza es comprobar que el certificado esté emitido para el mismo identificador URI (Uniform Resource Identifier) que la dirección en la que se invoca.

  2. Cree una nueva instancia de la clase ServiceMetadataBehavior.

  3. Establezca la propiedad HttpsGetEnabled de la clase ServiceMetadataBehavior en true.

  4. Establezca la propiedad HttpsGetUrl en una URL adecuada. Tenga en cuenta que si especifica una dirección absoluta, la dirección URL debe empezar con el esquema https://. Si especifica una dirección relativa, debe proporcionar una dirección base de HTTPS para su host de servicio. Si esta propiedad no está establecida, la dirección predeterminada es "", o directamente en la dirección base de HTTPS para el servicio.

  5. Agregue la instancia a la colección de comportamientos que la propiedad Behaviors de las clases ServiceDescription devuelve, como se muestra en el código siguiente.

    // Create a new metadata behavior object and set its properties to
    // create a secure endpoint.
    ServiceMetadataBehavior sb = new ServiceMetadataBehavior();
    sb.HttpsGetEnabled = true;
    sb.HttpsGetUrl = new Uri("https://myMachineName:8036/myEndpoint");
    myServiceHost.Description.Behaviors.Add(sb);
    
    myServiceHost.Open();
    
    ' Create a new metadata behavior object and set its properties to 
    ' create a secure endpoint. 
    Dim sb As New ServiceMetadataBehavior()
    
    With sb
        .HttpsGetEnabled = True
        .HttpsGetUrl = New Uri("https://myMachineName:8036/myEndpoint")
    End With
    
    With myServiceHost
        .Description.Behaviors.Add(sb)
        .Open()
    End With
    

Para crear un punto de conexión seguro de metadatos HTTPS GET en configuración

  1. Agregue un elemento <behaviors> al elemento <system.serviceModel> del archivo de configuración del servicio.

  2. Agregue un elemento <serviceBehaviors> al elemento <behaviors>.

  3. Agregue un elemento <behavior> al elemento <serviceBehaviors>.

  4. Establezca el atributo name del elemento <behavior> en un valor adecuado. El atributo name es necesario. El ejemplo siguiente utiliza el valor mySvcBehavior.

  5. Agregue un elemento <serviceMetadata> al elemento <behavior>.

  6. Establezca el atributo httpsGetEnabled del elemento <serviceMetadata> en true:

  7. Establezca el atributo httpsGetUrl del elemento <serviceMetadata> en un valor adecuado. Tenga en cuenta que si especifica una dirección absoluta, la dirección URL debe empezar con el esquema https://. Si especifica una dirección relativa, debe proporcionar una dirección base de HTTPS para su host de servicio. Si esta propiedad no está establecida, la dirección predeterminada es "", o directamente en la dirección base de HTTPS para el servicio.

  8. Para usar el comportamiento con un servicio, establezca el atributo behaviorConfiguration del elemento <service> en el valor del atributo de nombre del elemento de comportamiento. El código de configuración siguiente muestra un ejemplo completo.

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
     <system.serviceModel>
      <behaviors>
       <serviceBehaviors>
        <behavior name="mySvcBehavior">
         <serviceMetadata httpsGetEnabled="true"
              httpsGetUrl="https://localhost:8036/calcMetadata" />
        </behavior>
       </serviceBehaviors>
      </behaviors>
     <services>
      <service behaviorConfiguration="mySvcBehavior"
            name="Microsoft.Security.Samples.Calculator">
       <endpoint address="http://localhost:8037/ServiceModelSamples/calculator"
       binding="wsHttpBinding" bindingConfiguration=""
       contract="Microsoft.Security.Samples.ICalculator" />
      </service>
     </services>
    </system.serviceModel>
    </configuration>
    

Ejemplo

El ejemplo siguiente crea una instancia de una clase ServiceHost y agrega un extremo. El código crea a continuación una instancia de la clase ServiceMetadataBehavior y establece las propiedades para crear un punto de intercambio seguro de metadatos.

WSHttpBinding myBinding = new WSHttpBinding();
myBinding.Security.Mode = SecurityMode.Message;
myBinding.Security.Message.ClientCredentialType =
    MessageCredentialType.Windows;

// Create the Type instances for later use and the URI for
// the base address.
Type contractType = typeof(ICalculator);
Type serviceType = typeof(Calculator);
Uri baseAddress = new
    Uri("http://localhost:8037/serviceModelSamples/");

// Create the ServiceHost and add an endpoint.
ServiceHost myServiceHost =
    new ServiceHost(serviceType, baseAddress);
myServiceHost.AddServiceEndpoint
    (contractType, myBinding, "secureCalculator");
// Create a new metadata behavior object and set its properties to
// create a secure endpoint.
ServiceMetadataBehavior sb = new ServiceMetadataBehavior();
sb.HttpsGetEnabled = true;
sb.HttpsGetUrl = new Uri("https://myMachineName:8036/myEndpoint");
myServiceHost.Description.Behaviors.Add(sb);

myServiceHost.Open();
// Use the GetHostEntry method to return the actual machine name.
string machineName = System.Net.Dns.GetHostEntry("").HostName ;
Console.WriteLine("Listening @ {0}:8037/serviceModelSamples/", machineName);
Console.WriteLine("Press Enter to close the service");
Console.ReadLine();
myServiceHost.Close();
Dim myBinding As New WSHttpBinding()
With myBinding.Security
    .Mode = SecurityMode.Message
    .Message.ClientCredentialType = MessageCredentialType.Windows
End With

' Create the Type instances for later use and the URI for 
' the base address.
Dim contractType = GetType(ICalculator)
Dim serviceType = GetType(Calculator)
Dim baseAddress As New Uri("http://localhost:8037/serviceModelSamples/")

' Create the ServiceHost and add an endpoint. 
Dim myServiceHost As New ServiceHost(serviceType, baseAddress)
myServiceHost.AddServiceEndpoint(contractType, myBinding, "secureCalculator")

' Create a new metadata behavior object and set its properties to 
' create a secure endpoint. 
Dim sb As New ServiceMetadataBehavior()

With sb
    .HttpsGetEnabled = True
    .HttpsGetUrl = New Uri("https://myMachineName:8036/myEndpoint")
End With

With myServiceHost
    .Description.Behaviors.Add(sb)
    .Open()
End With

' Use the GetHostEntry method to return the actual machine name.
Dim machineName = System.Net.Dns.GetHostEntry("").HostName
Console.WriteLine("Listening @ {0}:8037/serviceModelSamples/", machineName)
Console.WriteLine("Press Enter to close the service")
Console.ReadLine()
myServiceHost.Close()

Compilar el código

El ejemplo de código utiliza los espacios de nombres siguientes:

Consulte también