Nasıl yapılır: Meta Veri Uç Noktalarını Güvenli Hale Getirme
Bir hizmetin meta verileri, kötü amaçlı bir kullanıcının yararlanabileceği, uygulamanız hakkında hassas bilgiler içerebilir. Hizmetinizin tüketicileri, hizmetinizle ilgili meta verileri almak için de güvenli bir mekanizma gerektirebilir. Bu nedenle, bazen güvenli bir uç nokta kullanarak meta verilerinizi yayımlamanız gerekir.
Meta veri uç noktaları genellikle uygulama uç noktalarının güvenliğini sağlamak için Windows Communication Foundation'da (WCF) tanımlanan standart güvenlik mekanizmaları kullanılarak güvenli hale getirilir. Daha fazla bilgi için bkz . Güvenliğe Genel Bakış.
Bu konu, Güvenli Yuva Katmanı (SSL) sertifikası veya başka bir deyişle HTTPS uç noktası ile güvenliği sağlanan bir uç nokta oluşturma adımlarında yol gösterir.
Kodda güvenli bir HTTPS GET meta veri uç noktası oluşturmak için
Bağlantı noktasını uygun bir X.509 sertifikasıyla yapılandırın. Sertifika güvenilir bir yetkiliden gelmelidir ve hedeflenen bir "Hizmet Yetkilendirmesi" kullanımına sahip olmalıdır. Sertifikayı bağlantı noktasına eklemek için HttpCfg.exe aracını kullanmanız gerekir. Bkz . Nasıl yapılır: SSL Sertifikası ile Bağlantı Noktası Yapılandırma.
Önemli
Sertifikanın veya Etki Alanı Adı Sistemi'nin (DNS) konusu bilgisayarın adıyla eşleşmelidir. HTTPS mekanizmasının gerçekleştirdiği ilk adımlardan biri, sertifikanın çağrıldığı adresle aynı Tekdüzen Kaynak Tanımlayıcısı'na (URI) verildiğini denetlemek olduğundan bu önemlidir.
Sınıfının yeni bir örneğini ServiceMetadataBehavior oluşturun.
HttpsGetEnabled sınıfının özelliğini ServiceMetadataBehavior olarak
true
ayarlayın.HttpsGetUrl özelliğini uygun bir URL'ye ayarlayın. Mutlak bir adres belirtirseniz URL'nin düzeniyle
https://
başlaması gerektiğini unutmayın. Göreli bir adres belirtirseniz, hizmet konağınız için bir HTTPS temel adresi sağlamanız gerekir. Bu özellik ayarlanmadıysa, varsayılan adres "" veya doğrudan hizmetin HTTPS temel adresindedir.Örneği, aşağıdaki kodda gösterildiği gibi sınıfın özelliğinin ServiceDescription döndürdüğü davranış koleksiyonuna Behaviors ekleyin.
// 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
Yapılandırmada güvenli bir HTTPS GET meta veri uç noktası oluşturmak için
Hizmetinizin yapılandırma dosyasının system.serviceModel> öğesine bir <behaviors> öğesi ekleyin.<
behaviors öğesine bir <serviceBehaviors> öğesi <ekleyin.>
öğesine bir <davranış> öğesi
<serviceBehaviors>
ekleyin.öğesinin
name
özniteliğini<behavior>
uygun bir değere ayarlayın.name
Özniteliği gereklidir. Aşağıdaki örnekte değerimySvcBehavior
kullanılır.öğesinin
httpsGetEnabled
özniteliğini<serviceMetadata>
olaraktrue
ayarlayın.öğesinin
httpsGetUrl
özniteliğini<serviceMetadata>
uygun bir değere ayarlayın. Mutlak bir adres belirtirseniz URL'nin düzeniylehttps://
başlaması gerektiğini unutmayın. Göreli bir adres belirtirseniz, hizmet konağınız için bir HTTPS temel adresi sağlamanız gerekir. Bu özellik ayarlanmadıysa, varsayılan adres "" veya doğrudan hizmetin HTTPS temel adresindedir.Davranışı bir hizmetle kullanmak için, hizmet> öğesinin <özniteliğini davranış öğesinin name özniteliğinin değerine ayarlayın
behaviorConfiguration
. Aşağıdaki yapılandırma kodu tam bir örneği gösterir.<?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>
Örnek
Aşağıdaki örnek bir ServiceHost sınıfın örneğini oluşturur ve bir uç nokta ekler. Kod daha sonra sınıfının bir örneğini ServiceMetadataBehavior oluşturur ve güvenli bir meta veri değişim noktası oluşturmak için özellikleri ayarlar.
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()
Kod Derleniyor
Kod örneği aşağıdaki ad alanlarını kullanır: