Dela via


Anvisningar: Säkra metadataslutpunkter

Metadata för en tjänst kan innehålla känslig information om ditt program som en obehörig användare kan utnyttja. Konsumenter av din tjänst kan också kräva en säker mekanism för att hämta metadata om din tjänst. Därför är det ibland nödvändigt att publicera dina metadata med hjälp av en säker slutpunkt.

Metadataslutpunkter skyddas vanligtvis med hjälp av de standardsäkerhetsmekanismer som definieras i Windows Communication Foundation (WCF) för att skydda programslutpunkter. Mer information finns i Säkerhetsöversikt.

Det här avsnittet går igenom stegen för att skapa en slutpunkt som skyddas av ett SSL-certifikat (Secure Sockets Layer) eller, med andra ord, en HTTPS-slutpunkt.

Skapa en säker HTTPS GET-metadataslutpunkt i kod

  1. Konfigurera en port med ett lämpligt X.509-certifikat. Certifikatet måste komma från en betrodd utfärdare och måste ha en avsedd användning av "Tjänstauktorisering". Du måste använda verktyget HttpCfg.exe för att koppla certifikatet till porten. Se Så här konfigurerar du en port med ett SSL-certifikat.

    Viktigt!

    Certifikatets eller dess DNS-ämne (Domain Name System) måste matcha datorns namn. Detta är viktigt eftersom ett av de första stegen som HTTPS-mekanismen utför är att kontrollera att certifikatet har utfärdats till samma URI (Uniform Resource Identifier) som adressen som det anropas på.

  2. Skapa en ny instans av ServiceMetadataBehavior klassen.

  3. HttpsGetEnabled Ange egenskapen för ServiceMetadataBehavior klassen till true.

  4. Ange egenskapen HttpsGetUrl till en lämplig URL. Observera att om du anger en absolut adress måste URL:en börja med schemat https://. Om du anger en relativ adress måste du ange en HTTPS-basadress för tjänstvärden. Om den här egenskapen inte har angetts är standardadressen "" eller direkt på HTTPS-basadressen för tjänsten.

  5. Lägg till instansen i den beteendesamling som Behaviors egenskapen ServiceDescription för klassen returnerar, enligt följande kod.

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

Så här skapar du en säker HTTPS GET-metadataslutpunkt i konfigurationen

  1. Lägg till ett <beteendeelement> i elementet< system.serviceModel> i konfigurationsfilen för din tjänst.

  2. Lägg till ett serviceBehaviors-element> i <beteendeelementet>.<

  3. Lägg till ett <beteendeelement> i elementet <serviceBehaviors> .

  4. name Ange attributet för elementet <behavior> till ett lämpligt värde. Attributet name krävs. I exemplet nedan används värdet mySvcBehavior.

  5. Lägg till en serviceMetadata> i elementet<behavior>.<

  6. httpsGetEnabled Ange -attributet för elementet <serviceMetadata> till true.

  7. httpsGetUrl Ange attributet för elementet <serviceMetadata> till ett lämpligt värde. Observera att om du anger en absolut adress måste URL:en börja med schemat https://. Om du anger en relativ adress måste du ange en HTTPS-basadress för tjänstvärden. Om den här egenskapen inte har angetts är standardadressen "" eller direkt på HTTPS-basadressen för tjänsten.

  8. Om du vill använda beteendet med en tjänst anger du behaviorConfiguration attributet <för tjänstelementet> till värdet för beteendeelementets namnattribut. Följande konfigurationskod visar ett fullständigt exempel.

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

Exempel

I följande exempel skapas en instans av en ServiceHost klass och en slutpunkt läggs till. Koden skapar sedan en instans av ServiceMetadataBehavior klassen och anger egenskaperna för att skapa en säker metadatautbytesplats.

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

Kompilera koden

Kodexemplet använder följande namnområden:

Se även