Bagikan melalui


Perilaku Keamanan di WCF

Di Windows Communication Foundation (WCF), perilaku memodifikasi perilaku run-time di tingkat layanan atau di tingkat titik akhir. (Untuk mengetahui informasi selengkapnya tentang perilaku secara umum, lihat Menentukan Perilaku Run-Time Layanan.) Perilaku keamanan memungkinkan kontrol atas mandat, autentikasi, otorisasi, dan log audit. Anda dapat menggunakan perilaku baik dengan pemrograman atau melalui konfigurasi. Topik ini berfokus pada konfigurasi perilaku berikut yang terkait dengan fungsi keamanan:

Mengatur Mandat dengan Perilaku

Gunakan <serviceCredentials> dan <clientCredentials> untuk mengatur nilai mandat untuk layanan atau klien. Konfigurasi pengikatan yang mendasar menentukan apakah mandat harus diatur. Misalnya, jika mode keamanan diatur ke None, klien dan layanan tidak saling mengautentikasi dan tidak memerlukan mandat jenis apa pun.

Di sisi lain, pengikatan layanan dapat memerlukan jenis mandat klien. Dalam hal ini, Anda mungkin harus menetapkan nilai mandat menggunakan perilaku. (Untuk mengetahui informasi selengkapnya tentang kemungkinan jenis mandat, lihat Memilih Jenis Mandat.) Dalam beberapa kasus, seperti saat mandat Windows digunakan untuk mengautentikasi, lingkungan secara otomatis menetapkan nilai mandat aktual dan Anda tidak perlu secara eksplisit mengatur nilai mandat (kecuali Anda ingin menentukan serangkaian mandat yang berbeda).

Semua mandat layanan ditemukan sebagai elemen turunan dari <serviceBehaviors>. Contoh berikut menunjukkan sertifikat yang digunakan sebagai mandat layanan.

<configuration>  
 <system.serviceModel>  
  <behaviors>  
   <serviceBehaviors>  
    <behavior name="ServiceBehavior1">  
     <serviceCredentials>  
      <serviceCertificate findValue="000000000000000000000000000"
                          storeLocation="CurrentUser"  
      storeName="Root" x509FindType="FindByThumbprint" />  
     </serviceCredentials>  
    </behavior>  
   </serviceBehaviors>  
  </behaviors>  
 </system.serviceModel>  
</configuration>  

Mandat Layanan

<serviceCredentials> berisi empat elemen turunan. Elemen dan penggunaannya dibahas di bagian berikut.

Elemen <serviceCertificate>

Gunakan elemen ini untuk menentukan sertifikat X.509 yang digunakan untuk mengautentikasi layanan ke klien menggunakan mode keamanan Pesan. Jika Anda menggunakan sertifikat yang diperpanjang secara berkala, thumbprint-nya berubah. Dalam hal ini, gunakan nama subjek sebagai X509FindType karena sertifikat dapat diterbitkan kembali dengan nama subjek yang sama.

Untuk mengetahui informasi selengkapnya tentang menggunakan elemen, lihat Cara: Menentukan Nilai Mandat Klien.

<sertifikat> Elemen <clientCertificate>

Gunakan elemen <sertifikat> saat layanan harus memiliki sertifikat klien terlebih dahulu untuk berkomunikasi dengan aman dengan klien. Ini terjadi saat menggunakan pola komunikasi dupleks. Dalam pola balasan permintaan yang lebih umum, klien menyertakan sertifikatnya dalam permintaan, yang digunakan layanan untuk mengamankan responsnya kembali ke klien. Namun, pola komunikasi dupleks tidak memiliki permintaan dan balasan. Layanan tidak dapat menyimpulkan sertifikat klien dari komunikasi dan oleh karena itu layanan memerlukan sertifikat klien terlebih dahulu untuk mengamankan pesan kepada klien. Anda harus mendapatkan sertifikat klien dengan cara di luar band dan menentukan sertifikat menggunakan elemen ini. Untuk informasi selengkapnya tentang layanan dupleks, lihat Cara: Membuat Kontrak Dupleks.

<autentikasi> Elemen <clientCertificate>

Elemen <autentikasi> memungkinkan Anda menyesuaikan cara klien diautentikasi. Anda dapat mengatur atribut CertificateValidationMode ke None, ChainTrust, PeerOrChainTrust, PeerTrust, atau Custom. Secara default, tingkat diatur ke ChainTrust, yang menentukan bahwa setiap sertifikat harus ditemukan dalam hierarki sertifikat yang berakhiran otoritas akar di bagian atas rantai. Ini adalah mode yang paling aman. Anda juga dapat mengatur nilai ke PeerOrChainTrust, yang menetapkan bahwa sertifikat yang diterbitkan sendiri (kepercayaan rekan) diterima serta sertifikat yang berada dalam rantai tepercaya. Nilai ini digunakan saat mengembangkan dan men-debug klien dan layanan karena sertifikat yang dikeluarkan sendiri tidak perlu dibeli dari otoritas tepercaya. Saat menyebarkan klien, gunakan nilai ChainTrust sebagai gantinya. Anda juga dapat mengatur nilainya ke Custom. Saat diatur ke nilai Custom, Anda juga harus mengatur atribut CustomCertificateValidatorType ke assembly dan jenis yang digunakan untuk memvalidasi sertifikat. Untuk membuat validator kustom Anda sendiri, Anda harus mewarisi dari kelas X509CertificateValidator abstrak.

Elemen <issuedTokenAuthentication>

Skenario token yang dikeluarkan memiliki tiga tahap. Pada tahap pertama, klien yang mencoba mengakses layanan disebut layanan token aman (STS). STS kemudian mengautentikasi klien dan kemudian mengeluarkan token kepada klien, biasanya token Security Assertions Markup Language (SAML). Klien kemudian kembali ke layanan dengan token. Layanan ini memeriksa token untuk data yang memungkinkan layanan mengautentikasi token dan oleh karena itu klien. Untuk mengautentikasi token, sertifikat yang digunakan layanan token aman harus diketahui oleh layanan. Elemen <issuedTokenAuthentication> adalah repositori untuk semua sertifikat layanan token aman tersebut. Untuk menambahkan sertifikat, gunakan <knownCertificates>. Sisipkan <penambahan> untuk setiap sertifikat, seperti yang ditunjukkan pada contoh berikut.

<issuedTokenAuthentication>  
   <knownCertificates>  
      <add findValue="www.contoso.com"
           storeLocation="LocalMachine" storeName="My"
           X509FindType="FindBySubjectName" />  
    </knownCertificates>  
</issuedTokenAuthentication>  

Secara default, sertifikat harus diperoleh dari layanan token aman. Sertifikat "dikenal" ini memastikan bahwa hanya klien yang sah yang dapat mengakses layanan.

Anda harus menggunakan koleksi <allowedAudienceUris> dalam aplikasi federasi yang menggunakan layanan token aman (STS) yang mengeluarkan token keamanan SamlSecurityToken. Saat STS mengeluarkan token keamanan, STS dapat menentukan URI layanan Web yang menjadi tujuan token keamanan dengan menambahkan SamlAudienceRestrictionCondition ke token keamanan. Itu memungkinkan SamlSecurityTokenAuthenticator untuk layanan Web penerima untuk memverifikasi bahwa token keamanan yang dikeluarkan ditujukan untuk layanan Web ini dengan menetapkan bahwa pemeriksaan ini harus dilakukan dengan melakukan hal berikut:

  • Atur atribut audienceUriMode dari <issuedTokenAuthentication> ke Always atau BearerKeyOnly.

  • Tentukan set URI yang valid, dengan menambahkan URI ke koleksi ini. Untuk melakukan ini, sisipkan add<> untuk setiap URI

Untuk informasi selengkapnya, lihat SamlSecurityTokenAuthenticator .

Untuk mengetahui informasi selengkapnya tentang menggunakan elemen konfigurasi ini, lihat Cara: Mengonfigurasi Mandat pada Layanan Federasi.

Mengizinkan Pengguna CardSpace Anonim

Mengatur atribut AllowUntrustedRsaIssuers elemen <IssuedTokenAuthentication> untuk true secara eksplisit memungkinkan klien mana pun menunjukkan token yang dikeluarkan sendiri yang ditandatangani dengan pasangan kunci RSA arbitrer. Pengeluar sertifikat tidak tepercaya karena kunci tidak memiliki data pengeluar sertifikat yang terkait dengannya. Pengguna CardSpace dapat membuat kartu yang diterbitkan sendiri yang menyertakan klaim identitas yang disediakan sendiri. Gunakan kemampuan ini dengan hati-hati. Untuk menggunakan fitur ini, anggap kunci umum RSA sebagai kata sandi yang lebih aman yang harus disimpan dalam database bersama dengan nama pengguna. Sebelum mengizinkan akses klien ke layanan, verifikasi kunci umum RSA yang disajikan klien dengan membandingkannya dengan kunci umum yang disimpan untuk nama pengguna yang disajikan. Ini mengasumsikan bahwa Anda telah menetapkan proses pendaftaran yang mana pengguna dapat mendaftarkan nama pengguna mereka dan mengaitkannya dengan kunci publik RSA yang dikeluarkan sendiri.

Kredensial Klien

Mandat klien digunakan untuk mengautentikasi klien ke layanan dalam kasus saat autentikasi bersama diperlukan. Anda dapat menggunakan bagian untuk menentukan sertifikat layanan untuk skenario saat klien harus mengamankan pesan ke layanan dengan sertifikat layanan.

Anda juga dapat mengonfigurasi klien sebagai bagian dari skenario federasi untuk menggunakan token yang dikeluarkan dari layanan token aman atau pengeluar sertifikat token lokal. Untuk informasi lebih lanjut tentang skenario federasi, lihat Federation and Issued Tokens. Semua mandat klien ditemukan di bawah <endpointBehaviors>, seperti yang ditunjukkan dalam kode berikut.

<behaviors>  
 <endpointBehaviors>  
  <behavior name="EndpointBehavior1">  
   <clientCredentials>  
    <clientCertificate findValue="cn=www.contoso.com"
        storeLocation="LocalMachine"  
        storeName="AuthRoot" x509FindType="FindBySubjectName" />  
    <serviceCertificate>  
     <defaultCertificate findValue="www.cohowinery.com"
                    storeLocation="LocalMachine"  
                    storeName="Root" x509FindType="FindByIssuerName" />  
    <authentication revocationMode="Online"  
                    trustedStoreLocation="LocalMachine" />  
    </serviceCertificate>  
   </clientCredentials>  
  </behavior>  
 </endpointBehaviors>  
</behaviors>  

Elemen <clientCertificate>

Atur sertifikat yang digunakan untuk mengautentikasi klien dengan elemen ini. Untuk mengetahui informasi selengkapnya, lihat Cara: Menentukan Nilai Mandat Klien.

<httpDigest>

Fitur ini harus diaktifkan dengan Active Directory di Windows dan Layanan Informasi Internet (IIS). Untuk mengetahui informasi selengkapnya, lihat Autentikasi Hash di IIS 6.0.

Elemen <issuedToken>

<IssuedToken> berisi elemen yang digunakan untuk mengonfigurasi pengeluar sertifikat token lokal, atau perilaku yang digunakan dengan layanan token keamanan. Untuk petunjuk tentang mengonfigurasi klien untuk menggunakan pengeluar sertifikat lokal, lihat Cara: Mengonfigurasi Pengeluar Sertifikat Lokal.

<localIssuerAddress>

Menentukan alamat layanan token keamanan default. Ini digunakan saat WSFederationHttpBinding tidak menyediakan URL untuk layanan token keamanan, atau saat alamat pengeluar sertifikat pengikatan federasi adalah http://schemas.microsoft.com/2005/12/ServiceModel/Addressing/Anonymous atau null. Dalam kasus seperti ini, ClientCredentials harus dikonfigurasi dengan alamat pengeluar sertifikat lokal dan pengikatan yang digunakan untuk berkomunikasi dengan pengeluar sertifikat tersebut.

<issuerChannelBehaviors>

Gunakan <issuerChannelBehaviors> untuk menambahkan perilaku klien WCF yang digunakan saat berkomunikasi dengan layanan token keamanan. Tentukan perilaku klien di bagian <endpointBehaviors>. Untuk menggunakan perilaku yang ditentukan, tambahkan elemen <add> ke elemen <issuerChannelBehaviors> dengan dua atribut. Atur issuerAddress ke URL layanan token keamanan dan atur atribut behaviorConfiguration ke nama perilaku titik akhir yang ditentukan, seperti yang ditunjukkan dalam contoh berikut.

<clientCredentials>  
   <issuedToken>  
      <issuerChannelBehaviors>  
         <add issuerAddress="http://www.contoso.com"  
               behaviorConfiguration="clientBehavior1" />
      </issuerChannelBehaviors>  
   </issuedToken>  
</clientCredentials>

Elemen <serviceCertificate>

Gunakan elemen ini untuk mengontrol autentikasi sertifikat layanan.

Elemen <defaultCertificate> dapat menyimpan satu sertifikat yang digunakan saat layanan tidak menentukan sertifikat.

Gunakan <scopedCertificates> dan <add> untuk mengatur sertifikat layanan yang terkait dengan layanan tertentu. Elemen <add> menyertakan atribut targetUri yang digunakan untuk mengaitkan sertifikat dengan layanan.

Elemen <authentication> menentukan tingkat kepercayaan yang digunakan untuk mengautentikasi sertifikat. Secara default, tingkat diatur ke "ChainTrust," yang menentukan bahwa setiap sertifikat harus ditemukan dalam hierarki sertifikat yang berakhiran otoritas sertifikasi tepercaya di bagian atas rantai. Ini adalah mode yang paling aman. Anda juga dapat mengatur nilai ke "PeerOrChainTrust", yang menentukan bahwa sertifikat yang diterbitkan sendiri (kepercayaan serekan) diterima, serta sertifikat yang berada dalam rantai tepercaya. Nilai ini digunakan saat mengembangkan dan men-debug klien dan layanan karena sertifikat yang dikeluarkan sendiri tidak perlu dibeli dari otoritas tepercaya. Saat menyebarkan klien, gunakan nilai "ChainTrust" sebagai gantinya. Anda juga dapat mengatur nilai ke "Kustom" atau "Tidak Ada." Untuk menggunakan nilai "Kustom", Anda juga harus mengatur atribut CustomCertificateValidatorType ke assembly dan jenis yang digunakan untuk memvalidasi sertifikat. Untuk membuat validator kustom Anda sendiri, Anda harus mewarisi dari kelas X509CertificateValidator abstrak. Untuk informasi selengkapnya, lihat Cara: Membuat Layanan yang Menggunakan Validator Sertifikat Kustom.

Elemen <authentication> menyertakan atribut RevocationMode yang menentukan cara sertifikat diperiksa untuk pencabutan. Defaultnya adalah "online", yang menunjukkan bahwa sertifikat secara otomatis diperiksa untuk pencabutan. Untuk informasi selengkapnya, lihat Bekerja dengan Sertifikat.

ServiceAuthorization

Elemen <serviceAuthorization> berisi elemen yang memengaruhi otorisasi, penyedia peran kustom, dan peniruan identitas.

Kelas PrincipalPermissionAttribute diterapkan ke metode layanan. Atribut menentukan grup pengguna yang akan digunakan saat mengotorisasi penggunaan metode yang dilindungi. Nilai defaultnya adalah "UseWindowsGroups" dan menentukan bahwa grup Windows, seperti "Administrator" atau "Pengguna," dicari untuk identitas yang mencoba mengakses sumber daya. Anda juga dapat menentukan "UseAspNetRoles" untuk menggunakan penyedia peran kustom yang dikonfigurasi di bawah elemen <system.web>, seperti yang ditunjukkan dalam kode berikut.

<system.web>  
  <membership defaultProvider="SqlProvider"
   userIsOnlineTimeWindow="15">  
     <providers>  
       <clear />  
       <add
          name="SqlProvider"
          type="System.Web.Security.SqlMembershipProvider"
          connectionStringName="SqlConn"  
          applicationName="MembershipProvider"  
          enablePasswordRetrieval="false"  
          enablePasswordReset="false"  
          requiresQuestionAndAnswer="false"  
          requiresUniqueEmail="true"  
          passwordFormat="Hashed" />  
     </providers>  
   </membership>  
  <!-- Other configuration code not shown.-->  
</system.web>  

Kode berikut menunjukkan roleProviderName yang digunakan dengan atribut principalPermissionMode.

<behaviors>  
 <behavior name="ServiceBehaviour">
  <serviceAuthorization principalPermissionMode ="UseAspNetRoles"
                        roleProviderName ="SqlProvider" />  
</behavior>
   <!-- Other configuration code not shown. -->  
</behaviors>  

Mengonfigurasi Audit Keamanan

Gunakan <serviceSecurityAudit> untuk menentukan log yang ditulis, dan jenis peristiwa apa yang akan dicatat. Untuk mengetahui informasi selengkapnya, lihat Pengauditan.

<behaviors>
 <serviceBehaviors>  
  <behavior name="NewBehavior">  
    <serviceSecurityAudit auditLogLocation="Application"
             suppressAuditFailure="true"  
             serviceAuthorizationAuditLevel="Success"
             messageAuthenticationAuditLevel="Success" />  
  </behavior>  
 </serviceBehaviors>  
</behaviors>  

Pertukaran Metadata Aman

Mengekspor metadata ke klien mudah bagi pengembang layanan dan klien, karena memungkinkan pengunduhan konfigurasi dan kode klien. Untuk mengurangi paparan layanan kepada pengguna berbahaya, dimungkinkan untuk mengamankan transfer menggunakan mekanisme SSL melalui HTTP (HTTPS). Untuk melakukannya, Anda harus terlebih dahulu mengikat sertifikat X.509 yang sesuai ke port tertentu di komputer yang menghosting layanan. (Untuk mengetahui informasi selengkapnya, lihat Bekerja dengan Sertifikat.) Kedua, tambahkan <serviceMetadata> ke konfigurasi layanan dan atur atribut HttpsGetEnabled ke true. Terakhir, atur atribut HttpsGetUrl ke URL titik akhir metadata layanan, seperti yang ditunjukkan dalam contoh berikut.

<behaviors>  
 <serviceBehaviors>  
  <behavior name="NewBehavior">  
    <serviceMetadata httpsGetEnabled="true"
     httpsGetUrl="https://myComputerName/myEndpoint" />  
  </behavior>  
 </serviceBehaviors>  
</behaviors>  

Lihat juga