Aracılığıyla paylaş


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

  1. 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.

  2. Sınıfının yeni bir örneğini ServiceMetadataBehavior oluşturun.

  3. HttpsGetEnabled sınıfının özelliğini ServiceMetadataBehavior olarak trueayarlayın.

  4. 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.

  5. Ö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

  1. Hizmetinizin yapılandırma dosyasının system.serviceModel> öğesine bir <behaviors> öğesi ekleyin.<

  2. behaviors öğesine bir <serviceBehaviors> öğesi <ekleyin.>

  3. öğesine bir <davranış> öğesi <serviceBehaviors> ekleyin.

  4. öğesinin name özniteliğini <behavior> uygun bir değere ayarlayın. name Özniteliği gereklidir. Aşağıdaki örnekte değeri mySvcBehaviorkullanılır.

  5. öğesine serviceMetadata <><behavior> ekleyin.

  6. öğesinin httpsGetEnabled özniteliğini <serviceMetadata> olarak trueayarlayın.

  7. öğesinin httpsGetUrl özniteliğini <serviceMetadata> uygun bir değere 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.

  8. Davranışı bir hizmetle kullanmak için, hizmet> öğesinin <özniteliğini davranış öğesinin name özniteliğinin değerine ayarlayınbehaviorConfiguration. 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:

Ayrıca bkz.