Bagikan melalui


Cara: Mengamankan Titik Akhir Metadata

Metadata untuk sebuah layanan dapat berisi informasi sensitif tentang aplikasi Anda yang dapat dimanfaatkan pengguna yang berpotensi membahayakan. Konsumen layanan Anda mungkin juga memerlukan mekanisme yang aman untuk mendapatkan metadata tentang layanan Anda. Oleh karena itu, terkadang perlu untuk menerbitkan metadata Anda menggunakan titik akhir yang aman.

Titik akhir metadata umumnya diamankan menggunakan mekanisme keamanan standar yang ditentukan dalam Windows Communication Foundation (WCF) untuk mengamankan titik akhir aplikasi. Untuk informasi selengkapnya, lihat Ringkasan Keamanan.

Topik ini menjelaskan langkah-langkah untuk membuat titik akhir yang diamankan oleh sertifikat Secure Sockets Layer (SSL) atau, dengan kata lain, titik akhir HTTPS.

Untuk membuat titik akhir metadata HTTPS GET yang aman dalam kode

  1. Konfigurasikan port dengan sertifikat X.509 yang sesuai. Sertifikat harus berasal dari otoritas yang terpercaya, dan harus memiliki penggunaan "Otorisasi Layanan" yang dimaksudkan. Anda harus menggunakan alat HttpCfg.exe untuk melampirkan sertifikat ke port. Lihat Cara: Mengonfigurasi Port dengan Sertifikat SSL.

    Penting

    Subjek sertifikat atau Sistem Nama Domain (DNS) harus cocok dengan nama komputer. Hal ini penting karena salah satu langkah pertama yang dilakukan mekanisme HTTPS adalah memeriksa apakah sertifikat dikeluarkan untuk Pengidentifikasi Sumber Daya Seragam (URI) yang sama dengan alamat tempat sertifikat dipanggil.

  2. Buat instans baru kelas ServiceMetadataBehavior.

  3. Atur properti HttpsGetEnabled kelas ServiceMetadataBehavior ke true.

  4. Atur properti HttpsGetUrl ke URL yang sesuai. Perhatikan bahwa jika Anda menentukan alamat absolut, URL harus dimulai dengan https:// skema. Jika Anda menentukan alamat relatif, Anda harus menyediakan alamat dasar HTTPS untuk host layanan Anda. Jika properti ini tidak diatur, alamat defaultnya adalah "", atau langsung pada alamat dasar HTTPS untuk layanan.

  5. Tambahkan instans ke kumpulan perilaku yang properti Behaviors kelas ServiceDescriptionyang dikembalikan, seperti yang ditunjukkan dalam kode berikut.

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

Untuk membuat titik akhir metadata HTTPS GET yang aman dalam konfigurasi

  1. Tambahkan elemen <perilaku> ke elemen <system.serviceModel> dari file konfigurasi untuk layanan Anda.

  2. Tambahkan elemen <serviceBehaviors> ke elemen <perilaku>.

  3. Tambahkan elemen <perilaku> ke elemen <serviceBehaviors>.

  4. Atur atribut name dari elemen <behavior> ke nilai yang sesuai. Atribut name tersebut diperlukan. Contoh di bawah ini menggunakan nilai mySvcBehavior.

  5. Tambahkan <serviceMetadata> ke elemen <behavior>.

  6. Atur atribut httpsGetEnabled dari elemen <serviceMetadata> ke true.

  7. Atur atribut httpsGetUrl dari elemen <serviceMetadata> ke nilai yang sesuai. Perhatikan bahwa jika Anda menentukan alamat absolut, URL harus dimulai dengan https:// skema. Jika Anda menentukan alamat relatif, Anda harus menyediakan alamat dasar HTTPS untuk host layanan Anda. Jika properti ini tidak diatur, alamat defaultnya adalah "", atau langsung pada alamat dasar HTTPS untuk layanan.

  8. Untuk menggunakan perilaku dengan sebuah layanan, atur atribut behaviorConfigurationdari elemen <layanan> ke nilai atribut nama elemen perilaku. Kode konfigurasi berikut menunjukkan contoh lengkap.

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

Contoh

Contoh berikut membuat instans kelas ServiceHost dan menambahkan titik akhir. Kode kemudian membuat instans kelas ServiceMetadataBehavior dan mengatur properti untuk membuat titik pertukaran metadata yang aman.

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

Mengompilasi Kode

Contoh kode menggunakan namespace layanan berikut:

Lihat juga