Memahami Tingkat Perlindungan

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

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

Catatan

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 setiap bagian dari pesan. Properti (di mana pun terjadi) diatur ke salah satu nilai enumerasi ProtectionLevel. Dalam urutan perlindungan yang menaik, mereka meliputi:

    • None.

    • Sign. Bagian yang dilindungi ditandatangani secara digital. Ini memastikan deteksi perubahan apa pun dengan 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 dipatuhi oleh pengikatan. Saat layanan disebarkan, pengikatan aktual yang ditentukan dalam konfigurasi dapat atau tidak dapat mendukung tingkat minimum. Misalnya, secara default, kelas BasicHttpBinding tidak menyediakan keamanan (meskipun dapat diaktifkan). Oleh karena itu, menggunakannya dengan kontrak yang memiliki pengaturan selain None akan menyebabkan pengecualian dilemparkan.

  • Jika layanan mengharuskan ProtectionLevel minimum 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 pengecualian akan dilemparkan.

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

  • Jika Anda memilih pengikatan yang tidak mengaktifkan keamanan (misalnya, kelas BasicHttpBindingmemiliki 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, 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

Mengatur ProtectionLevel pada API paling atas mengatur tingkat untuk semua tingkat di bawahnya. Jika ProtectionLevel 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 terpengaruh oleh tingkat paling atas). Hierarkinya adalah sebagai berikut. Atribut pada tingkat yang sama adalah serekan.

Pemrograman ProtectionLevel

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

Catatan

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

Dependensi WS-Addressing

Dalam kebanyakan kasus, menggunakan Alat Utilitas Metadata ServiceModel (Svcutil.exe) untuk menghasilkan klien memastikan bahwa kontrak klien dan layanan adalah sama. Namun, kontrak yang tampak sama dapat menyebabkan klien melemparkan pengecualian. Ini terjadi setiap kali pengikatan tidak mendukung spesifikasi WS-Addressing dan beberapa tingkat perlindungan ditentukan pada kontrak. Misalnya, kelas BasicHttpBinding tidak mendukung spesifikasi, atau jika Anda membuat pengikatan kustom yang tidak mendukung WS-Addressing. Fitur 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.

Ini dapat menyebabkan masalah yang sulit di-debug secara sekilas. 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 kelas BasicHttpBinding, 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 melempar pengecualian karena mengharapkan tingkat perlindungan yang lebih tinggi.

Contoh kode mengilustrasikan masalah ini. Contoh berikut menunjukkan kontrak layanan dan klien. Asumsikan bahwa pengikatan adalah elemen <basicHttpBinding>. 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 metode Tax 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 metode Price, 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 metode Price. Namun, layanan mengembalikan nilai yang menggunakan tingkat Sign 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