Como: proteger pontos de extremidade de metadadosHow to: Secure Metadata Endpoints

Os metadados de um serviço podem conter informações confidenciais sobre o aplicativo que um usuário mal-intencionado pode aproveitar.Metadata for a service can contain sensitive information about your application that a malicious user can leverage. Os consumidores do seu serviço também podem exigir um mecanismo seguro para obter metadados sobre seu serviço.Consumers of your service may also require a secure mechanism for obtaining metadata about your service. Portanto, às vezes é necessário publicar seus metadados usando um ponto de extremidade seguro.Therefore, it is sometimes necessary to publish your metadata using a secure endpoint.

Os pontos de extremidade de metadados são geralmente protegidos usando os mecanismos de segurança padrão definidos no Windows Communication Foundation (WCF) para proteger os pontos de extremidade do aplicativo.Metadata endpoints are generally secured using the standard security mechanisms defined in Windows Communication Foundation (WCF) for securing application endpoints. Para obter mais informações, consulte Visão geral de segurança.For more information, see Security Overview.

Este tópico percorre as etapas para criar um ponto de extremidade protegido por um certificado protocolo SSL (SSL) ou, em outras palavras, um ponto de extremidade HTTPS.This topic walks through the steps to create an endpoint secured by a Secure Sockets Layer (SSL) certificate or, in other words, an HTTPS endpoint.

Para criar um ponto de extremidade de obtenção de metadados de HTTPS seguro no códigoTo create a secure HTTPS GET metadata endpoint in code

  1. Configure uma porta com um certificado X. 509 apropriado.Configure a port with an appropriate X.509 certificate. O certificado deve vir de uma autoridade confiável e deve ter um uso pretendido de "autorização de serviço".The certificate must come from a trusted authority, and it must have an intended use of "Service Authorization." Você deve usar a ferramenta HttpCfg.exe para anexar o certificado à porta.You must use the HttpCfg.exe tool to attach the certificate to the port. Consulte como: configurar uma porta com um certificado SSL.See How to: Configure a Port with an SSL Certificate.

    Importante

    O assunto do certificado ou seu DNS (sistema de nomes de domínio) deve corresponder ao nome do computador.The subject of the certificate or its Domain Name System (DNS) must match the name of the computer. Isso é essencial porque uma das primeiras etapas que o mecanismo HTTPS executa é verificar se o certificado é emitido para o mesmo Uniform Resource Identifier (URI) que o endereço no qual ele é invocado.This is essential because one of the first steps the HTTPS mechanism performs is to check that the certificate is issued to the same Uniform Resource Identifier (URI) as the address upon which it is invoked.

  2. Crie uma nova instância da classe ServiceMetadataBehavior.Create a new instance of the ServiceMetadataBehavior class.

  3. Defina a HttpsGetEnabled propriedade da ServiceMetadataBehavior classe como true .Set the HttpsGetEnabled property of the ServiceMetadataBehavior class to true.

  4. Defina a HttpsGetUrl propriedade como uma URL apropriada.Set the HttpsGetUrl property to an appropriate URL. Observe que, se você especificar um endereço absoluto, a URL deverá começar com o esquema https:// .Note that if you specify an absolute address, the URL must begin with the scheme https://. Se você especificar um endereço relativo, deverá fornecer um endereço base HTTPS para seu host de serviço.If you specify a relative address, you must supply an HTTPS base address for your service host. Se essa propriedade não for definida, o endereço padrão será "", ou diretamente no endereço base HTTPS para o serviço.If this property is not set, the default address is "", or directly at the HTTPS base address for the service.

  5. Adicione a instância à coleção de comportamentos que a Behaviors propriedade da ServiceDescription classe retorna, conforme mostrado no código a seguir.Add the instance to the behaviors collection that the Behaviors property of the ServiceDescription class returns, as shown in the following code.

    // 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 criar um ponto de extremidade de obtenção de metadados de HTTPS seguro na configuraçãoTo create a secure HTTPS GET metadata endpoint in configuration

  1. Adicione um <behaviors> elemento ao <system.serviceModel> elemento do arquivo de configuração para seu serviço.Add a <behaviors> element to the <system.serviceModel> element of the configuration file for your service.

  2. Adicione um <serviceBehaviors> elemento ao <behaviors> elemento.Add a <serviceBehaviors> element to the <behaviors> element.

  3. Adicione um <behavior> elemento ao <serviceBehaviors> elemento.Add a <behavior> element to the <serviceBehaviors> element.

  4. Defina o name atributo do <behavior> elemento para um valor apropriado.Set the name attribute of the <behavior> element to an appropriate value. O atributo name é necessário.The name attribute is required. O exemplo a seguir usa o valor mySvcBehavior .The example below uses the value mySvcBehavior.

  5. Adicione um <serviceMetadata> ao <behavior> elemento.Add a <serviceMetadata> to the <behavior> element.

  6. Defina o atributo httpsGetEnabled do elemento <serviceMetadata> como true.Set the httpsGetEnabled attribute of the <serviceMetadata> element to true.

  7. Defina o httpsGetUrl atributo do <serviceMetadata> elemento para um valor apropriado.Set the httpsGetUrl attribute of the <serviceMetadata> element to an appropriate value. Observe que, se você especificar um endereço absoluto, a URL deverá começar com o esquema https:// .Note that if you specify an absolute address, the URL must begin with the scheme https://. Se você especificar um endereço relativo, deverá fornecer um endereço base HTTPS para seu host de serviço.If you specify a relative address, you must supply an HTTPS base address for your service host. Se essa propriedade não for definida, o endereço padrão será "", ou diretamente no endereço base HTTPS para o serviço.If this property is not set, the default address is "", or directly at the HTTPS base address for the service.

  8. Para usar o comportamento com um serviço, defina o behaviorConfiguration atributo do <service> elemento como o valor do atributo Name do elemento Behavior.To use the behavior with a service, set the behaviorConfiguration attribute of the <service> element to the value of the name attribute of the behavior element. O código de configuração a seguir mostra um exemplo completo.The following configuration code shows a complete example.

    <?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>
    

ExemploExample

O exemplo a seguir cria uma instância de uma ServiceHost classe e adiciona um ponto de extremidade.The following example creates an instance of a ServiceHost class and adds an endpoint. Em seguida, o código cria uma instância da ServiceMetadataBehavior classe e define as propriedades para criar um ponto de troca de metadados seguro.The code then creates an instance of the ServiceMetadataBehavior class and sets the properties to create a secure metadata exchange point.

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()

Compilando o códigoCompiling the Code

O exemplo de código usa os seguintes namespaces:The code example uses the following namespaces:

Consulte tambémSee also