Delen via


Procedure: Eindpunten voor beveiligde metagegevens

Metagegevens voor een service kunnen gevoelige informatie bevatten over uw toepassing die een kwaadwillende gebruiker kan gebruiken. Consumenten van uw service vereisen mogelijk ook een veilig mechanisme voor het verkrijgen van metagegevens over uw service. Daarom is het soms nodig om uw metagegevens te publiceren met behulp van een beveiligd eindpunt.

Metagegevenseindpunten worden over het algemeen beveiligd met behulp van de standaardbeveiligingsmechanismen die zijn gedefinieerd in WCF (Windows Communication Foundation) voor het beveiligen van toepassingseindpunten. Zie Beveiligingsoverzicht voor meer informatie.

In dit onderwerp worden de stappen beschreven voor het maken van een eindpunt dat is beveiligd met een SSL-certificaat (Secure Sockets Layer) of met andere woorden een HTTPS-eindpunt.

Een beveiligd HTTPS GET-metagegevenseindpunt maken in code

  1. Configureer een poort met een geschikt X.509-certificaat. Het certificaat moet afkomstig zijn van een vertrouwde instantie en moet beschikken over het beoogde gebruik van 'Serviceautorisatie'. U moet het hulpprogramma HttpCfg.exe gebruiken om het certificaat aan de poort te koppelen. Zie Procedure: Een poort configureren met een SSL-certificaat.

    Belangrijk

    Het onderwerp van het certificaat of het DNS (Domain Name System) moet overeenkomen met de naam van de computer. Dit is essentieel omdat een van de eerste stappen die het HTTPS-mechanisme uitvoert, is controleren of het certificaat wordt uitgegeven aan dezelfde URI (Uniform Resource Identifier) als het adres waarop het wordt aangeroepen.

  2. Maak een nieuw exemplaar van de ServiceMetadataBehavior klasse.

  3. Stel de HttpsGetEnabled eigenschap van de ServiceMetadataBehavior klasse in op true.

  4. Stel de HttpsGetUrl eigenschap in op een juiste URL. Als u een absoluut adres opgeeft, moet de URL beginnen met het schema https://. Als u een relatief adres opgeeft, moet u een HTTPS-basisadres opgeven voor uw servicehost. Als deze eigenschap niet is ingesteld, is het standaardadres '' of rechtstreeks op het HTTPS-basisadres voor de service.

  5. Voeg het exemplaar toe aan de gedragverzameling die door de Behaviors eigenschap van de ServiceDescription klasse wordt geretourneerd, zoals wordt weergegeven in de volgende 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
    

Een beveiligd HTTPS GET-metagegevenseindpunt maken in de configuratie

  1. Voeg een <gedragselement> toe aan het <element system.serviceModel> van het configuratiebestand voor uw service.

  2. Voeg een serviceBehaviors-element> toe aan het <gedragselement>.<

  3. Voeg een <gedragselement> toe aan het <serviceBehaviors> element.

  4. Stel het name kenmerk van het <behavior> element in op een juiste waarde. Het name kenmerk is vereist. In het onderstaande voorbeeld wordt de waarde mySvcBehaviorgebruikt.

  5. Voeg een <serviceMetadata> toe aan het <behavior> element.

  6. Stel het httpsGetEnabled kenmerk van het <serviceMetadata> element in op true.

  7. Stel het httpsGetUrl kenmerk van het <serviceMetadata> element in op een juiste waarde. Als u een absoluut adres opgeeft, moet de URL beginnen met het schema https://. Als u een relatief adres opgeeft, moet u een HTTPS-basisadres opgeven voor uw servicehost. Als deze eigenschap niet is ingesteld, is het standaardadres '' of rechtstreeks op het HTTPS-basisadres voor de service.

  8. Als u het gedrag met een service wilt gebruiken, stelt u het behaviorConfiguration kenmerk van het <service-element> in op de waarde van het naamkenmerk van het gedragselement. De volgende configuratiecode toont een volledig voorbeeld.

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

Opmerking

In het volgende voorbeeld wordt een exemplaar van een ServiceHost klasse gemaakt en wordt een eindpunt toegevoegd. De code maakt vervolgens een exemplaar van de ServiceMetadataBehavior klasse en stelt de eigenschappen in om een beveiligd uitwisselingspunt voor metagegevens te maken.

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

De code compileren

In het codevoorbeeld worden de volgende naamruimten gebruikt:

Zie ook