Gewusst wie: Sichere MetadatenendpunkteHow to: Secure Metadata Endpoints

Metadaten für einen Dienst können vertrauliche Informationen über Ihre Anwendung enthalten, die böswillige Benutzer für ihre Zwecke missbrauchen können.Metadata for a service can contain sensitive information about your application that a malicious user can leverage. Die Consumer Ihres Diensts benötigen möglicherweise auch einen sicheren Mechanismus für den Zugriff auf Metadaten über Ihren Dienst.Consumers of your service may also require a secure mechanism for obtaining metadata about your service. Deshalb ist es manchmal notwendig, die Metadaten mit einem sicheren Endpunkt zu veröffentlichen.Therefore, it is sometimes necessary to publish your metadata using a secure endpoint.

Metadatenendpunkte sind in der Regel mit den Standardsicherheitsmechanismen, die in Windows Communication Foundation (WCF)Windows Communication Foundation (WCF) zum Sichern von Anwendungsendpunkten definiert werden, gesichert.Metadata endpoints are generally secured using the standard security mechanisms defined in Windows Communication Foundation (WCF)Windows Communication Foundation (WCF) for securing application endpoints. (Weitere Informationen finden Sie unterFor more information, see Sicherheitsübersicht.)(Weitere Informationen finden Sie unterFor more information, see Security Overview.)

In diesem Thema sind die Schritte zur Erstellung eines Endpunkts beschrieben, der durch ein Verbunddienst-SSL-Zertifikat gesichert ist, also anders ausgedrückt: die Schritte zur Erstellung eines HTTPS-Endpunkts.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.

So erstellen Sie einen sicheren HTTPS-GET-Metadatenendpunkt in CodeTo create a secure HTTPS GET metadata endpoint in code

  1. Konfigurieren Sie einen Anschluss mit einem entsprechenden X.509-Zertifikat.Configure a port with an appropriate X.509 certificate. Das Zertifikat muss von einer vertrauenswürdigen Stelle stammen und für die Verwendung zum Zwecke der Dienstautorisierung beabsichtigt sein.The certificate must come from a trusted authority, and it must have an intended use of "Service Authorization." Sie müssen das Tool HttpCfg.exe verwenden, um das Zertifikat an den Anschluss anzufügen.You must use the HttpCfg.exe tool to attach the certificate to the port. Finden Sie unter Vorgehensweise: Konfigurieren eines Anschlusses mit einem SSL-Zertifikat.See How to: Configure a Port with an SSL Certificate.

    Wichtig

    Der Betreff des Zertifikats oder das DNS (Domain Name System) muss mit dem Namen des Computers übereinstimmen.The subject of the certificate or its Domain Name System (DNS) must match the name of the computer. Dies ist deshalb wichtig, weil einer der ersten Schritte des HTTPS-Mechanismus darin besteht, zu überprüfen, ob das Zertifikat für denselben URI (Uniform Resource Identifier) ausgestellt wurde wie die Adresse, von der aus es aufgerufen wird.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. Erstellen Sie eine neue Instanz der ServiceMetadataBehavior-Klasse.Create a new instance of the ServiceMetadataBehavior class.

  3. Legen Sie die HttpsGetEnabled-Eigenschaft der ServiceMetadataBehavior-Klasse auf true fest.Set the HttpsGetEnabled property of the ServiceMetadataBehavior class to true.

  4. Legen Sie für die HttpsGetUrl-Eigenschaft einen geeigneten URL fest.Set the HttpsGetUrl property to an appropriate URL. Beachten Sie, dass die URL mit dem Schema "https://" beginnen muss, wenn Sie eine absolute Adresse angeben.Note that if you specify an absolute address, the URL must begin with the scheme "https://". Wenn Sie eine relative Adresse angeben, müssen Sie eine HTTPS-Basisadresse für den Diensthost angeben.If you specify a relative address, you must supply an HTTPS base address for your service host. Wenn diese Eigenschaft nicht festgelegt ist, lautet die Standardadresse "" oder befindet sich direkt an der HTTPS-Basisadresse für den Dienst.If this property is not set, the default address is "", or directly at the HTTPS base address for the service.

  5. Fügen Sie der Verhaltenssammlung die Instanz hinzu, die von der Behaviors-Eigenschaft der ServiceDescription-Klasse zurückgegeben wird, wie im folgenden Code dargestellt.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
    

So erstellen Sie einen sicheren HTTPS-GET-Metadatenendpunkt in der KonfigurationTo create a secure HTTPS GET metadata endpoint in configuration

  1. Hinzufügen einer <Verhalten > Element an der <system.serviceModel > Element der Konfigurationsdatei für den Dienst.Add a <behaviors> element to the <system.serviceModel> element of the configuration file for your service.

  2. Hinzufügen einer <ServiceBehaviors > Element an der <Verhalten > Element.Add a <serviceBehaviors> element to the <behaviors> element.

  3. Hinzufügen einer <Verhalten > Element an der <serviceBehaviors> Element.Add a <behavior> element to the <serviceBehaviors> element.

  4. Legen Sie einen angemessenen Wert für das name-Attribut des <behavior>-Elements fest.Set the name attribute of the <behavior> element to an appropriate value. Das name-Attribut ist erforderlich.The name attribute is required. Das nachstehende Beispiel verwendet den Wert mySvcBehavior.The example below uses the value mySvcBehavior.

  5. Hinzufügen einer <ServiceMetadata > auf die <behavior> Element.Add a <serviceMetadata> to the <behavior> element.

  6. Legen Sie das httpsGetEnabled-Attribut des <serviceMetadata>-Elements auf true fest.Set the httpsGetEnabled attribute of the <serviceMetadata> element to true.

  7. Legen Sie einen angemessenen Wert für das httpsGetUrl-Attribut des <serviceMetadata>-Elements fest.Set the httpsGetUrl attribute of the <serviceMetadata> element to an appropriate value. Beachten Sie, dass die URL mit dem Schema "https://" beginnen muss, wenn Sie eine absolute Adresse angeben.Note that if you specify an absolute address, the URL must begin with the scheme "https://". Wenn Sie eine relative Adresse angeben, müssen Sie eine HTTPS-Basisadresse für den Diensthost angeben.If you specify a relative address, you must supply an HTTPS base address for your service host. Wenn diese Eigenschaft nicht festgelegt ist, lautet die Standardadresse "" oder befindet sich direkt an der HTTPS-Basisadresse für den Dienst.If this property is not set, the default address is "", or directly at the HTTPS base address for the service.

  8. Um das Verhalten mit einem Dienst verwenden möchten, legen die behaviorConfiguration Attribut von der <Service > -Elements auf den Wert des Attributs Name des verhaltenselements.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. Der folgende Konfigurationscode zeigt ein vollständiges Beispiel.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>  
    

BeispielExample

Im folgenden Beispiel wird eine Instanz einer ServiceHost-Klasse erstellt und ein Endpunkt hinzugefügt.The following example creates an instance of a ServiceHost class and adds an endpoint. Anschließend erstellt der Code eine Instanz der ServiceMetadataBehavior-Klasse und legt die Eigenschaften zur Erstellung eines sicheren Punkts für den Metadatenaustausch fest.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()

Kompilieren des CodesCompiling the Code

Das Codebeispiel verwendet die folgenden Namespaces:The code example uses the following namespaces:

Siehe auchSee Also

HttpsGetEnabled
ServiceMetadataBehavior
HttpsGetUrl
Vorgehensweise: Konfigurieren eines Ports mit einem SSL-ZertifikatHow to: Configure a Port with an SSL Certificate
Arbeiten mit ZertifikatenWorking with Certificates
Sicherheitsüberlegungen für MetadatenSecurity Considerations with Metadata
Sichern von Diensten und ClientsSecuring Services and Clients