Udostępnij za pośrednictwem


Instrukcje: Bezpieczne punkty końcowe metadanych

Metadane usługi mogą zawierać poufne informacje o aplikacji, z których może korzystać złośliwy użytkownik. Użytkownicy usługi mogą również wymagać bezpiecznego mechanizmu uzyskiwania metadanych dotyczących usługi. W związku z tym czasami konieczne jest opublikowanie metadanych przy użyciu bezpiecznego punktu końcowego.

Punkty końcowe metadanych są zwykle zabezpieczone przy użyciu standardowych mechanizmów zabezpieczeń zdefiniowanych w programie Windows Communication Foundation (WCF) na potrzeby zabezpieczania punktów końcowych aplikacji. Aby uzyskać więcej informacji, zobacz Omówienie zabezpieczeń.

W tym temacie opisano kroki tworzenia punktu końcowego zabezpieczonego za pomocą certyfikatu Secure Sockets Layer (SSL) lub, innymi słowy, punktu końcowego HTTPS.

Aby utworzyć bezpieczny punkt końcowy metadanych HTTPS GET w kodzie

  1. Skonfiguruj port przy użyciu odpowiedniego certyfikatu X.509. Certyfikat musi pochodzić z zaufanego urzędu i musi mieć zamierzone użycie "Autoryzacja usługi". Aby dołączyć certyfikat do portu, należy użyć narzędzia HttpCfg.exe. Zobacz Instrukcje: konfigurowanie portu przy użyciu certyfikatu SSL.

    Ważne

    Podmiot certyfikatu lub jego systemu nazw domen (DNS) musi być zgodny z nazwą komputera. Jest to niezbędne, ponieważ jednym z pierwszych kroków, które wykonuje mechanizm HTTPS, jest sprawdzenie, czy certyfikat jest wystawiony na ten sam identyfikator URI (Uniform Resource Identifier) co adres, na którym jest wywoływany.

  2. Utwórz nowe wystąpienie ServiceMetadataBehavior klasy.

  3. HttpsGetEnabled Ustaw właściwość ServiceMetadataBehavior klasy na true.

  4. HttpsGetUrl Ustaw właściwość na odpowiedni adres URL. Należy pamiętać, że jeśli określisz adres bezwzględny, adres URL musi zaczynać się od schematu https://. Jeśli określisz adres względny, musisz podać podstawowy adres HTTPS dla hosta usługi. Jeśli ta właściwość nie jest ustawiona, adres domyślny to "" lub bezpośrednio pod adresem podstawowym HTTPS dla usługi.

  5. Dodaj wystąpienie do kolekcji zachowań zwracanej Behaviors przez właściwość ServiceDescription klasy, jak pokazano w poniższym kodzie.

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

Aby utworzyć bezpieczny punkt końcowy metadanych HTTPS GET w konfiguracji

  1. <Dodaj element behaviors> do< elementu system.serviceModel> pliku konfiguracji dla usługi.

  2. Dodaj element serviceBehaviors> do< elementu behaviors>.<

  3. <Dodaj element zachowania> do <serviceBehaviors> elementu .

  4. name Ustaw atrybut <behavior> elementu na odpowiednią wartość. name Atrybut jest wymagany. W poniższym przykładzie użyto wartości mySvcBehavior.

  5. Dodaj element serviceMetadata><behavior>.<

  6. Ustaw atrybut httpsGetEnabled elementu <serviceMetadata> na true.

  7. httpsGetUrl Ustaw atrybut <serviceMetadata> elementu na odpowiednią wartość. Należy pamiętać, że jeśli określisz adres bezwzględny, adres URL musi zaczynać się od schematu https://. Jeśli określisz adres względny, musisz podać podstawowy adres HTTPS dla hosta usługi. Jeśli ta właściwość nie jest ustawiona, adres domyślny to "" lub bezpośrednio pod adresem podstawowym HTTPS dla usługi.

  8. Aby użyć zachowania z usługą, ustaw behaviorConfiguration atrybut< elementu usługi> na wartość atrybutu name elementu zachowania. Poniższy kod konfiguracji przedstawia kompletny przykład.

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

Przykład

Poniższy przykład tworzy wystąpienie ServiceHost klasy i dodaje punkt końcowy. Następnie kod tworzy wystąpienie ServiceMetadataBehavior klasy i ustawia właściwości w celu utworzenia bezpiecznego punktu wymiany metadanych.

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

Kompilowanie kodu

W przykładzie kodu są używane następujące przestrzenie nazw:

Zobacz też