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
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.
Buat instans baru kelas ServiceMetadataBehavior.
Atur properti HttpsGetEnabled kelas ServiceMetadataBehavior ke
true
.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.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
Tambahkan elemen <perilaku> ke elemen <system.serviceModel> dari file konfigurasi untuk layanan Anda.
Tambahkan elemen <serviceBehaviors> ke elemen <perilaku>.
Tambahkan elemen <perilaku> ke elemen
<serviceBehaviors>
.Atur atribut
name
dari elemen<behavior>
ke nilai yang sesuai. Atributname
tersebut diperlukan. Contoh di bawah ini menggunakan nilaimySvcBehavior
.Tambahkan <serviceMetadata> ke elemen
<behavior>
.Atur atribut
httpsGetEnabled
dari elemen<serviceMetadata>
ketrue
.Atur atribut
httpsGetUrl
dari elemen<serviceMetadata>
ke nilai yang sesuai. Perhatikan bahwa jika Anda menentukan alamat absolut, URL harus dimulai denganhttps://
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.Untuk menggunakan perilaku dengan sebuah layanan, atur atribut
behaviorConfiguration
dari 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: