Bagikan melalui


Memahami Tingkat Perlindungan

Properti ProtectionLevel ini ditemukan di banyak kelas yang berbeda, seperti ServiceContractAttribute kelas dan OperationContractAttribute . Properti mengontrol bagaimana bagian (atau keseluruhan) pesan dilindungi. Topik ini menjelaskan fitur Windows Communication Foundation (WCF) dan cara kerjanya.

Untuk petunjuk tentang mengatur tingkat perlindungan, lihat Cara: Mengatur Properti ProtectionLevel.

Nota

Tingkat perlindungan hanya dapat diatur dalam kode, bukan dalam konfigurasi.

Dasar

Untuk memahami fitur tingkat perlindungan, pernyataan dasar berikut berlaku:

  • Ada tiga tingkat perlindungan dasar untuk bagian mana pun dari pesan. Properti (di mana pun berada) diatur ke salah satu nilai enumerasi ProtectionLevel. Dalam urutan peningkatan perlindungan, mereka meliputi:

    • None.

    • Sign. Bagian yang dilindungi ditandatangani secara digital. Ini memastikan deteksi penyusupan terhadap bagian pesan yang dilindungi.

    • EncryptAndSign. Bagian pesan dienkripsi untuk memastikan kerahasiaan sebelum ditandatangani.

  • Anda hanya dapat mengatur persyaratan perlindungan untuk data aplikasi dengan fitur ini. Misalnya, header WS-Addressing adalah data infrastruktur dan, oleh karena itu, tidak terpengaruh oleh ProtectionLevel.

  • Ketika mode keamanan diatur ke Transport, seluruh pesan dilindungi oleh mekanisme transportasi. Oleh karena itu, mengatur tingkat perlindungan terpisah untuk berbagai bagian pesan tidak berpengaruh.

  • ProtectionLevel adalah cara bagi pengembang untuk mengatur tingkat minimum yang harus dipakui oleh pengikatan. Ketika layanan disebarkan, pengikatan aktual yang ditentukan dalam konfigurasi mungkin atau mungkin tidak mendukung tingkat minimum. Misalnya, secara default, BasicHttpBinding kelas tidak menyediakan keamanan (meskipun dapat diaktifkan). Oleh karena itu, menggunakannya dengan kontrak yang memiliki pengaturan selain None akan memicu pengecualian.

  • Jika layanan mengharuskan bahwa minimum ProtectionLevel untuk semua pesan adalah Sign, klien (mungkin dibuat oleh teknologi non-WCF) dapat mengenkripsi dan menandatangani semua pesan (yang lebih dari minimum yang diperlukan). Dalam hal ini, WCF tidak akan melemparkan pengecualian karena klien telah melakukan lebih dari minimum. Namun, perhatikan bahwa aplikasi WCF (layanan atau klien) tidak akan mengamankan bagian pesan secara berlebihan jika memungkinkan tetapi akan mematuhi tingkat minimum. Perhatikan juga bahwa saat menggunakan Transport sebagai mode keamanan, transportasi dapat mengamankan aliran pesan secara berlebihan karena secara inheren tidak dapat mengamankan pada tingkat yang lebih terperinci.

  • Jika Anda mengatur ProtectionLevel secara eksplisit ke Sign atau EncryptAndSign, maka Anda harus menggunakan pengikatan dengan keamanan diaktifkan atau akan terjadi kesalahan.

  • Jika Anda memilih pengikatan yang memungkinkan keamanan dan Anda tidak mengatur ProtectionLevel properti di mana pun pada kontrak, semua data aplikasi akan dienkripsi dan ditandatangani.

  • Jika Anda memilih pengikatan yang tidak mengaktifkan keamanan (misalnya, BasicHttpBinding kelas memiliki keamanan yang dinonaktifkan secara default), dan ProtectionLevel tidak diatur secara eksplisit, maka tidak ada data aplikasi yang akan dilindungi.

  • Jika Anda menggunakan pengikatan yang menerapkan keamanan di tingkat transportasi, semua data aplikasi akan diamankan sesuai dengan kemampuan transportasi.

  • Jika Anda menggunakan pengikatan yang menerapkan keamanan di tingkat pesan, maka data aplikasi akan diamankan sesuai dengan tingkat perlindungan yang ditetapkan pada kontrak. Jika Anda tidak menentukan tingkat perlindungan, maka semua data aplikasi dalam pesan akan dienkripsi dan ditandatangani.

  • ProtectionLevel dapat diatur pada tingkat cakupan yang berbeda. Ada hierarki yang terkait dengan cakupan, yang dijelaskan di bagian berikutnya.

Cakupan

ProtectionLevel Mengatur pada API paling atas mengatur tingkat untuk semua tingkat di bawahnya. ProtectionLevel Jika diatur ke nilai yang berbeda pada tingkat yang lebih rendah, semua API di bawah tingkat tersebut dalam hierarki sekarang akan diatur ulang ke tingkat baru (API di atasnya, namun, masih akan dipengaruhi oleh tingkat paling atas). Hierarkinya adalah sebagai berikut. Atribut di tingkat yang sama adalah setara.

Tingkat Perlindungan Pemrograman

Untuk memprogram ProtectionLevel kapan saja dalam hierarki, cukup atur properti ke nilai yang sesuai saat menerapkan atribut. Misalnya, lihat Cara: Mengatur Properti ProtectionLevel.

Nota

Mengatur properti pada kesalahan dan kontrak pesan memerlukan pemahaman tentang cara fitur tersebut bekerja. Untuk informasi selengkapnya, lihat Cara: Mengatur Properti ProtectionLevel dan Menggunakan Kontrak Pesan.

Dependensi WS-Addressing

Dalam kebanyakan kasus, menggunakan ServiceModel Metadata Utility Tool (Svcutil.exe) untuk menghasilkan klien memastikan bahwa klien dan kontrak layanan identik. Namun, kontrak yang tampaknya identik dapat menyebabkan klien melemparkan pengecualian. Ini terjadi setiap kali pengikatan tidak mendukung spesifikasi WS-Addressing dan beberapa tingkat perlindungan ditentukan pada kontrak. Misalnya, BasicHttpBinding kelas tidak mendukung spesifikasi, atau jika Anda membuat pengikatan kustom yang tidak mendukung WS-Addressing. Fitur ini ProtectionLevel bergantung pada spesifikasi WS-Addressing untuk mengaktifkan tingkat perlindungan yang berbeda pada satu kontrak. Jika pengikatan tidak mendukung spesifikasi WS-Addressing, semua tingkat akan diatur ke tingkat perlindungan yang sama. Tingkat perlindungan yang efektif untuk semua cakupan kontrak akan diatur ke tingkat perlindungan terkuat yang digunakan pada kontrak.

Hal ini dapat menyebabkan masalah yang sulit di-debug pada pandangan pertama. Dimungkinkan untuk membuat kontrak klien (antarmuka) yang mencakup metode untuk lebih dari satu layanan. Artinya, antarmuka yang sama digunakan untuk membuat klien yang berkomunikasi dengan banyak layanan, dan antarmuka tunggal berisi metode untuk semua layanan. Pengembang harus berhati-hati dalam skenario langka ini untuk hanya memanggil metode yang berlaku untuk setiap layanan tertentu. Jika pengikatan adalah BasicHttpBinding kelas , beberapa tingkat perlindungan tidak dapat didukung. Namun, layanan yang membalas klien mungkin merespons klien dengan tingkat perlindungan yang lebih rendah dari yang diperlukan. Dalam hal ini, klien akan melemparkan pengecualian karena mengharapkan tingkat perlindungan yang lebih tinggi.

Contoh kode mengilustrasikan masalah ini. Contoh berikut menunjukkan layanan dan kontrak klien. Asumsikan bahwa pengikatan adalah <elemen dasarHttpBinding> . Oleh karena itu, semua operasi pada kontrak memiliki tingkat perlindungan yang sama. Tingkat perlindungan seragam ini ditentukan sebagai tingkat perlindungan maksimum di semua operasi.

Kontrak layanan adalah:

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

Kode berikut menunjukkan antarmuka kontrak klien. Perhatikan bahwa ini termasuk Tax metode yang dimaksudkan untuk digunakan dengan layanan yang berbeda:

[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

Ketika klien memanggil Price metode , klien melemparkan pengecualian ketika menerima balasan dari layanan. Ini terjadi karena klien tidak menentukan ProtectionLevel pada ServiceContractAttribute, dan oleh karena itu klien menggunakan default (EncryptAndSign) untuk semua metode, termasuk Price metode . Namun, layanan mengembalikan nilai menggunakan Sign tingkat karena kontrak layanan menentukan satu metode yang memiliki tingkat perlindungannya diatur ke Sign. Dalam hal ini, klien akan melemparkan kesalahan saat memvalidasi respons dari layanan.

Lihat juga