Bagikan melalui


Mengamankan Klien

Di Windows Communication Foundation (WCF), layanan menentukan persyaratan keamanan untuk klien. Artinya, layanan menentukan mode keamanan apa yang akan digunakan, dan apakah klien harus memberikan mandat atau tidak. Dengan begitu, pengamanan klien merupakan proses yang sederhana: gunakan metadata yang diperoleh dari layanan (jika diterbitkan) dan bangun klien. Metadata menentukan cara mengonfigurasi klien. Jika layanan mengharuskan klien memberikan mandat, Anda harus mendapatkan mandat yang sesuai dengan persyaratan. Topik ini membahas prosesnya secara lebih rinci. Untuk mengetahui informasi selengkapnya tentang pembuatan layanan yang aman, lihat Mengamankan Layanan.

Layanan Menentukan Keamanan

Secara default, pengikatan WCF memiliki fitur keamanan yang aktif. (Pengecualiannya adalah BasicHttpBinding.) Oleh karena itu, jika layanan dibuat menggunakan WCF, kemungkinan lebih besar layanan akan menerapkan keamanan untuk memastikan autentikasi, kerahasiaan, dan integritas. Dalam hal ini, metadata yang disediakan layanan akan menunjukkan hal yang diperlukan untuk membangun saluran komunikasi yang aman. Jika metadata layanan tidak menyertakan persyaratan keamanan apa pun, tidak ada cara untuk memberlakukan skema keamanan, seperti SSL melalui HTTP, pada layanan. Namun, jika layanan mengharuskan klien untuk memberikan mandat, pengembang klien, penyebar, atau administrator harus memberikan mandat aktual yang akan digunakan klien untuk mengautentikasi diri ke layanan.

Mendapatkan Metadata

Saat membuat klien, langkah pertama adalah mendapatkan metadata untuk layanan yang akan berkomunikasi dengan klien. Hal ini dapat dilakukan dengan 2 cara. Pertama, jika layanan menerbitkan titik akhir pertukaran metadata (MEX) atau membuat metadatanya tersedia melalui HTTP atau HTTPS, Anda dapat mengunduh metadata menggunakan Alat Utilitas Metadata ServiceModel (Svcutil.exe), yang menghasilkan file kode untuk klien serta file konfigurasi. (Untuk mengetahui informasi selengkapnya tentang penggunaan alat ini, lihat Mengakses Layanan Menggunakan Klien WCF.) Jika layanan tidak menerbitkan titik akhir MEX dan juga tidak membuat metadatanya tersedia melalui HTTP atau HTTPS, Anda harus menghubungi pembuat layanan untuk dokumentasi yang menjelaskan persyaratan keamanan dan metadata.

Penting

Disarankan agar metadata berasal dari sumber tepercaya dan tidak diubah sama sekali. Metadata yang diambil menggunakan protokol HTTP dikirim dalam teks yang jelas dan dapat diubah. Jika layanan menggunakan properti HttpsGetEnabled dan HttpsGetUrl, gunakan URL yang disediakan pembuat layanan untuk mengunduh data menggunakan protokol HTTPS.

Memvalidasi Keamanan

Sumber metadata dapat dibagi menjadi dua kategori besar: sumber tepercaya dan sumber yang tidak tepercaya. Jika Anda mempercayai sumber dan telah mengunduh kode klien dan metadata lain dari titik akhir MEX aman sumber tersebut, Anda dapat membangun klien, menyediakannya dengan mandat yang tepat, dan menjalankannya tanpa masalah lain.

Namun, jika Anda memilih untuk mengunduh klien dan metadata dari sumber yang tidak banyak Anda ketahui, pastikan untuk memvalidasi langkah-langkah keamanan yang digunakan kode. Misalnya, Anda sama sekali tidak boleh membuat klien yang mengirimkan informasi pribadi atau keuangan Anda ke layanan kecuali layanan tersebut menuntut kerahasiaan dan integritas (setidaknya). Anda harus mempercayai pemilik layanan jika bersedia mengungkapkan informasi tersebut, karena informasi tersebut akan terlihat oleh mereka.

Oleh karena itu, sebagai aturan, saat menggunakan kode dan metadata dari sumber yang tidak tepercaya, periksa kode dan metadata untuk memastikan bahwa kode tersebut memenuhi tingkat keamanan yang Anda butuhkan.

Mengatur Mandat Klien

Pengaturan mandat klien pada klien terdiri dari dua langkah:

  1. Tentukan jenis mandat klien yang diperlukan layanan. Hal ini dapat dilakukan dengan salah satu dari dua metode. Pertama, jika Anda memiliki dokumentasi dari pembuat layanan, dokumen harus menentukan jenis mandat klien (jika ada) yang diperlukan layanan. Kedua, jika hanya memiliki file konfigurasi yang dihasilkan oleh alat Svcutil.exe, Anda dapat memeriksa pengikatan individual untuk menentukan jenis mandat apa yang diperlukan.

  2. Tentukan mandat klien yang sebenarnya. Mandat klien yang sebenarnya disebut nilai mandat klien untuk membedakannya dari jenis. Misalnya, jika jenis mandat klien menentukan sertifikat, Anda harus menyediakan sertifikat X.509 yang diterbitkan oleh otoritas sertifikasi yang dipercaya layanan.

Menentukan Jenis Mandat Klien

Jika Anda memiliki file konfigurasi yang dihasilkan alat Svcutil.exe, periksa bagian <pengikatan> untuk menentukan jenis mandat klien apa yang diperlukan. Di bagian tersebut ada elemen pengikatan yang menentukan persyaratan keamanan. Secara khusus, periksa Elemen <keamanan> dari setiap pengikatan. Elemen tersebut mencakup atribut mode, yang dapat Anda atur ke salah satu dari tiga nilai yang mungkin (Message, Transport, atau TransportWithMessageCredential). Nilai atribut menentukan mode, dan mode menentukan elemen turunan mana yang signifikan.

Elemen <security> dapat berisi elemen <transport> atau <message>, atau keduanya. Elemen penting tersebut adalah elemen yang cocok dengan mode keamanan. Misalnya, kode berikut menentukan bahwa mode keamanan adalah "Message", dan jenis mandat klien untuk elemen <message> adalah "Certificate". Dalam kasus ini, elemen <transport> dapat diabaikan. Namun, elemen <message> menentukan bahwa sertifikat X.509 harus disediakan.

<wsHttpBinding>  
    <binding name="WSHttpBinding_ICalculator">  
       <security mode="Message">  
           <transport clientCredentialType="Windows"
                      realm="" />  
           <message clientCredentialType="Certificate"
                    negotiateServiceCredential="true"  
                    algorithmSuite="Default"
                    establishSecurityContext="true" />  
       </security>  
    </binding>  
</wsHttpBinding>  

Perhatikan bahwa jika atribut clientCredentialType diatur ke "Windows", seperti yang ditunjukkan dalam contoh berikut, Anda tidak perlu menyediakan nilai mandat aktual. Hal ini karena keamanan terintegrasi Windows memberikan mandat aktual (token Kerberos) dari orang yang menjalankan klien.

<security mode="Message">  
    <transport clientCredentialType="Windows "
        realm="" />  
</security>  

Mengatur Nilai Mandat Klien

Jika ditentukan bahwa klien harus menyediakan mandat, gunakan metode yang sesuai untuk mengonfigurasi klien. Misalnya, untuk mengatur sertifikat klien, gunakan metode SetCertificate.

Bentuk umum mandat adalah sertifikat X.509. Anda dapat menyediakan mandat dengan dua cara:

  • Dengan memprogramnya dalam kode klien Anda (menggunakan metode SetCertificate).

Dengan menambahkan bagian <perilaku> dari file konfigurasi untuk klien dan menggunakan elemen clientCredentials (ditunjukkan di bawah).

Mengatur Nilai <clientCredentials> dalam Kode

Untuk mengatur nilai <clientCredentials> dalam kode, Anda harus mengakses properti ClientCredentials kelas ClientBase<TChannel>. Properti mengembalikan objek ClientCredentials yang memungkinkan akses ke berbagai jenis mandat, seperti yang diperlihatkan dalam tabel berikut.

Properti ClientCredential Deskripsi Catatan
ClientCertificate Mengembalikan X509CertificateInitiatorClientCredential Mewakili sertifikat X.509 yang disediakan oleh klien untuk mengautentikasi sendiri ke layanan.
HttpDigest Mengembalikan HttpDigestClientCredential Mewakili mandat digest HTTP. Mandat adalah hash dari nama pengguna dan kata sandi.
IssuedToken Mengembalikan IssuedTokenClientCredential Mewakili token keamanan kustom yang dikeluarkan oleh Layanan Token Keamanan, yang biasa digunakan dalam skenario federasi.
Peer Mengembalikan PeerCredential Mewakili mandat serekan untuk berpartisipasi dalam Cloud pada domain Windows.
ServiceCertificate Mengembalikan X509CertificateRecipientClientCredential Mewakili sertifikat X.509 yang disediakan oleh layanan dalam negosiasi out-of-band.
UserName Mengembalikan UserNamePasswordClientCredential Mewakili pasangan nama pengguna dan kata sandi.
Windows Mengembalikan WindowsClientCredential Mewakili mandat klien Windows (mandat Kerberos). Properti kelas bersifat baca-saja.

Mengatur Nilai <clientCredentials> dalam Konfigurasi

Nilai mandat ditentukan dengan menggunakan perilaku titik akhir sebagai elemen turunan dari elemen <clientCredentials>. Elemen yang digunakan tergantung pada jenis mandat klien. Misalnya, contoh berikut menunjukkan konfigurasi untuk mengatur sertifikat X.509 menggunakan <<clientCertificate>.

<configuration>  
  <system.serviceModel>  
    <behaviors>  
      <endpointBehaviors>
        <behavior name="myEndpointBehavior">  
          <clientCredentials>  
            <clientCertificate findvalue="myMachineName"
            storeLocation="Current" X509FindType="FindBySubjectName" />  
          </clientCredentials>  
        </behavior>
      </endpointBehaviors>
    </behaviors>
  </system.serviceModel>  
</configuration>  

Untuk mengatur mandat klien dalam konfigurasi, tambahkan elemen <endpointBehaviors> ke file konfigurasi. Selain itu, elemen perilaku yang ditambahkan harus ditautkan ke titik akhir layanan menggunakan atribut behaviorConfiguration<titik akhir> elemen <klien> seperti yang ditunjukkan dalam contoh berikut. Nilai atribut behaviorConfiguration harus cocok dengan nilai atribut name perilaku.

<configuration>
  <system.serviceModel>
    <client>
      <endpoint address="http://localhost/servicemodelsamples/service.svc"
                binding="wsHttpBinding"
                bindingConfiguration="Binding1"
                behaviorConfiguration="myEndpointBehavior"
                contract="Microsoft.ServiceModel.Samples.ICalculator" />
    </client>
  </system.serviceModel>
</configuration>

Catatan

Beberapa nilai mandat klien tidak dapat diatur menggunakan file konfigurasi aplikasi, misalnya, nama pengguna dan kata sandi, atau nilai pengguna Windows dan kata sandinya. Nilai mandat tersebut hanya dapat ditentukan dalam kode.

Untuk mengetahui informasi selengkapnya pengaturan mandat klien, lihat Petunjuk: Menentukan Nilai Mandat Klien.

Catatan

ClientCredentialType diabaikan ketika SecurityMode diatur ke "TransportWithMessageCredential", seperti yang ditunjukkan dalam konfigurasi sampel berikut.

<wsHttpBinding>  
    <binding name="PingBinding">  
        <security mode="TransportWithMessageCredential"  >  
           <message  clientCredentialType="UserName"
               establishSecurityContext="false"
               negotiateServiceCredential="false" />  
           <transport clientCredentialType="Certificate"  />  
         </security>  
    </binding>  
</wsHttpBinding>  

Lihat juga