Aracılığıyla paylaş


Koruma Düzeylerini Anlama

ProtectionLevel özelliği ve OperationContractAttribute gibi birçok farklı sınıfta ServiceContractAttribute bulunur. özelliği, iletinin bir bölümünün (veya tamamının) nasıl korunduğunu denetler. Bu konuda Windows Communication Foundation (WCF) özelliği ve nasıl çalıştığı açıklanmaktadır.

Koruma düzeyini ayarlama yönergeleri için bkz . Nasıl yapılır: ProtectionLevel Özelliğini Ayarlama.

Not

Koruma düzeyleri yapılandırmada değil yalnızca kodda ayarlanabilir.

Temel bilgiler

Koruma düzeyi özelliğini anlamak için aşağıdaki temel deyimler geçerlidir:

  • İletinin herhangi bir bölümü için üç temel koruma düzeyi vardır. özelliği (nerede olursa olsun) numaralandırma değerlerinden ProtectionLevel birine ayarlanır. Artan koruma sırasına göre şunları içerir:

    • None.

    • Sign. Korumalı bölüm dijital olarak imzalanır. Bu, korumalı ileti bölümüyle yapılan tüm kurcalamaların algılanmasını sağlar.

    • EncryptAndSign. İleti bölümü, imzalanana kadar gizliliği sağlamak için şifrelenir.

  • Bu özellik ile yalnızca uygulama verileri için koruma gereksinimlerini ayarlayabilirsiniz. Örneğin, WS-Adresleme üst bilgileri altyapı verileridir ve bu nedenle tarafından etkilenmez ProtectionLevel.

  • Güvenlik modu olarak Transportayarlandığında, iletinin tamamı aktarım mekanizması tarafından korunur. Bu nedenle, iletinin farklı bölümleri için ayrı bir koruma düzeyi ayarlamanın hiçbir etkisi yoktur.

  • ProtectionLevel, geliştiricinin bağlamanın uyması gereken en düşük düzeyi ayarlamasının bir yoludur. Bir hizmet dağıtıldığında, yapılandırmada belirtilen gerçek bağlama en düşük düzeyi destekleyebilecek veya desteklemeyebilir. Örneğin, varsayılan olarak sınıfı BasicHttpBinding güvenlik sağlamaz (etkinleştirilebilir olsa da). Bu nedenle, bunun dışında None herhangi bir ayarı olan bir sözleşmeyle kullanılması bir özel durumun ortaya alınmasına neden olur.

  • Hizmet tüm iletiler için en düşük ProtectionLevel değerin olması Signgerekiyorsa, bir istemci (wcf olmayan bir teknoloji tarafından oluşturulmuş olabilir) tüm iletileri şifreleyebilir ve imzalayabilir (gereken en düşük değerden fazladır). Bu durumda, istemci minimumdan fazlasını yaptığı için WCF özel durum oluşturmaz. Ancak, WCF uygulamalarının (hizmetler veya istemciler) mümkünse ileti bölümünün güvenliğini aşırı sağlamayacağını ancak en düşük düzeye uygun olacağını unutmayın. Ayrıca, güvenlik modu olarak kullanıldığında Transport aktarım, daha ayrıntılı bir düzeyde güvenli hale gelemediğinden ileti akışının güvenliğini aşırı sağlayabilir.

  • öğesini açıkça Sign veya EncryptAndSignolarak ayarlarsanızProtectionLevel, güvenlik etkin bir bağlama kullanmanız gerekir, aksi takdirde bir özel durum oluşturulur.

  • Güvenliği sağlayan bir bağlama seçerseniz ve özelliği sözleşmenin ProtectionLevel herhangi bir yerinde ayarlamazsanız, tüm uygulama verileri şifrelenir ve imzalanır.

  • Güvenliği etkin olmayan bir bağlama seçerseniz (örneğin, sınıfın BasicHttpBinding varsayılan olarak güvenliği devre dışıdır) ve ProtectionLevel açıkça ayarlanmadıysa, uygulama verilerinin hiçbiri korunmaz.

  • Aktarım düzeyinde güvenlik uygulayan bir bağlama kullanıyorsanız, tüm uygulama verilerinin güvenliği taşımanın özelliklerine göre sağlanır.

  • İleti düzeyinde güvenlik uygulayan bir bağlama kullanırsanız, uygulama verilerinin güvenliği sözleşmede ayarlanan koruma düzeylerine göre sağlanır. Bir koruma düzeyi belirtmezseniz, iletilerdeki tüm uygulama verileri şifrelenir ve imzalanır.

  • ProtectionLevel farklı kapsam düzeylerinde ayarlanabilir. Kapsam belirlemeyle ilişkilendirilmiş bir hiyerarşi vardır ve bu hiyerarşi sonraki bölümde açıklanmıştır.

Kapsam Belirleme

ProtectionLevel en üstteki API'yi ayarlamak, altındaki tüm düzeyler için düzeyi ayarlar. ProtectionLevel daha düşük bir düzeyde farklı bir değere ayarlanırsa, hiyerarşideki bu düzeyin altındaki tüm API'ler artık yeni düzeye sıfırlanır (ancak üzerindeki API'ler en üst düzeyden etkilenmeye devam eder). Hiyerarşi aşağıdaki gibidir. Aynı düzeydeki öznitelikler eştir.

Programlama KorumasıLevel

öğesini hiyerarşinin herhangi bir noktasında programlamak ProtectionLevel için özniteliğini uygularken özelliğini uygun bir değere ayarlamanız yeterlidir. Örnekler için bkz . Nasıl yapılır: ProtectionLevel Özelliğini Ayarlama.

Not

Hatalarda ve ileti sözleşmelerinde özelliğini ayarlamak için bu özelliklerin nasıl çalıştığını anlamak gerekir. Daha fazla bilgi için bkz . Nasıl yapılır: ProtectionLevel Özelliğini Ayarlama ve İleti Sözleşmelerini Kullanma.

WS Adresleme Bağımlılığı

Çoğu durumda, istemci oluşturmak için ServiceModel Meta Veri Yardımcı Programı Aracı'nın (Svcutil.exe) kullanılması, istemci ve hizmet sözleşmelerinin aynı olmasını sağlar. Ancak, benzer gibi görünen sözleşmeler istemcinin bir özel durum oluşturmasına neden olabilir. Bu durum, bir bağlama WS-Addressing belirtimini desteklemediği ve sözleşmede birden çok koruma düzeyi belirtildiğinde oluşur. Örneğin, BasicHttpBinding sınıfı belirtimi desteklemez veya WS-Addressing'i desteklemeyen bir özel bağlama oluşturursanız. Özellik, ProtectionLevel tek bir sözleşmede farklı koruma düzeylerini etkinleştirmek için WS-Addressing belirtimine dayanır. Bağlama WS-Adresleme belirtimini desteklemiyorsa, tüm düzeyler aynı koruma düzeyine ayarlanır. Sözleşmedeki tüm kapsamlar için etkin koruma düzeyi, sözleşmede kullanılan en güçlü koruma düzeyine ayarlanır.

Bu, ilk bakışta hata ayıklaması zor bir soruna neden olabilir. Birden fazla hizmet için yöntemler içeren bir istemci sözleşmesi (arabirim) oluşturmak mümkündür. Başka bir ifadeyle, aynı arabirim birçok hizmetle iletişim kuran bir istemci oluşturmak için kullanılır ve tek arabirim tüm hizmetler için yöntemler içerir. Geliştiricinin yalnızca belirli bir hizmet için geçerli olan yöntemleri çağırmak için bu nadir senaryoda dikkatli olması gerekir. Bağlama sınıfıysa BasicHttpBinding , birden çok koruma düzeyi desteklenemez. Ancak, istemciyi yanıtlayan bir hizmet, istemciye gerekenden daha düşük bir koruma düzeyiyle yanıt verebilir. Bu durumda istemci, daha yüksek bir koruma düzeyi beklediğinden bir özel durum oluşturur.

Kod örneği bu sorunu gösterir. Aşağıdaki örnekte bir hizmet ve istemci sözleşmesi gösterilmektedir. Bağlamanın temelHttpBinding> öğesi olduğunu <varsayalım. Bu nedenle, bir sözleşmedeki tüm işlemler aynı koruma düzeyine sahiptir. Bu tekdüzen koruma düzeyi tüm operasyonlarda maksimum koruma düzeyi olarak belirlenir.

Hizmet sözleşmesi şöyledir:

[ServiceContract()]
public interface IPurchaseOrder
{
    [OperationContract(ProtectionLevel = ProtectionLevel.Sign)]
    int Price();
}
<ServiceContract()> _
Public Interface IPurchaseOrder
    <OperationContract(ProtectionLevel:=ProtectionLevel.Sign)> _
    Function Price() As Integer
End Interface

Aşağıdaki kod, istemci sözleşmesi arabirimini gösterir. Farklı bir hizmetle kullanılması amaçlanan bir Tax yöntem içerdiğini unutmayın:

[ServiceContract()]
public interface IPurchaseOrder
{
    [OperationContract()]
    int Tax();

    [OperationContract(ProtectionLevel = ProtectionLevel.Sign)]
    int Price();
}
<ServiceContract()> _
Public Interface IPurchaseOrder
    <OperationContract()> _
    Function Tax() As Integer

    <OperationContract(ProtectionLevel:=ProtectionLevel.Sign)> _
    Function Price() As Integer
End Interface

İstemci yöntemini çağırdığında Price , hizmetten bir yanıt aldığında bir özel durum oluşturur. Bunun nedeni, istemcinin üzerinde bir ProtectionLevel belirtmemesi ve bu nedenle istemcinin yöntemi dahil olmak üzere tüm yöntemler için varsayılanı (EncryptAndSign) kullanmasıdırPrice.ServiceContractAttribute Ancak hizmet sözleşmesi, koruma düzeyi olarak ayarlanmış Signtek bir yöntem tanımladığından, hizmet düzeyini kullanarak Sign değeri döndürür. Bu durumda istemci, hizmetten gelen yanıtı doğrularken bir hata oluşturur.

Ayrıca bkz.