Titik Akhir Metadata Aman Kustom

Sampel CustomMexEndpoint mendemonstrasikan cara menerapkan layanan dengan titik akhir metadata aman yang menggunakan salah satu pengikatan pertukaran non-metadata dan cara mengonfigurasi Alat Utilitas Metadata ServiceModel (Svcutil.exe) atau klien untuk mengambil metadata dari titik akhir metadata tersebut. Ada dua pengikatan yang disediakan sistem yang tersedia untuk mengekspos titik akhir metadata: mexHttpBinding dan mexHttpsBinding. mexHttpBinding digunakan untuk mengekspos titik akhir metadata melalui HTTP dengan cara yang tidak aman. mexHttpsBinding digunakan untuk mengekspos titik akhir metadata melalui HTTPS dengan cara yang aman. Sampel ini menggambarkan cara mengekspos titik akhir metadata aman menggunakan WSHttpBinding. Anda ingin melakukan ini ketika Anda ingin mengubah pengaturan keamanan pada pengikatan, tetapi Anda tidak ingin menggunakan HTTPS. Jika Anda menggunakan mexHttpsBinding, titik akhir metadata Anda akan aman, tetapi tidak ada cara untuk mengubah pengaturan pengikatan.

Catatan

Prosedur penyiapan dan petunjuk build untuk sampel ini berada di akhir topik ini.

Layanan

Layanan dalam sampel ini memiliki dua titik akhir. Titik akhir aplikasi melayani kontrak ICalculator pada WSHttpBinding dengan ReliableSession diaktifkan dan keamanan Message menggunakan sertifikat. Titik akhir metadata juga menggunakan WSHttpBinding, dengan pengaturan keamanan yang sama tetapi tanpa ReliableSession. Berikut adalah konfigurasi yang relevan:

<services>
    <service name="Microsoft.ServiceModel.Samples.CalculatorService"
             behaviorConfiguration="CalculatorServiceBehavior">
     <!-- use base address provided by host -->
     <endpoint address=""
       binding="wsHttpBinding"
       bindingConfiguration="Binding2"
       contract="Microsoft.ServiceModel.Samples.ICalculator" />
     <endpoint address="mex"
       binding="wsHttpBinding"
       bindingConfiguration="Binding1"
       contract="IMetadataExchange" />
     </service>
 </services>
 <bindings>
   <wsHttpBinding>
     <binding name="Binding1">
       <security mode="Message">
         <message clientCredentialType="Certificate" />
       </security>
     </binding>
     <binding name="Binding2">
       <reliableSession inactivityTimeout="00:01:00" enabled="true" />
       <security mode="Message">
         <message clientCredentialType="Certificate" />
       </security>
     </binding>
   </wsHttpBinding>
 </bindings>

Di banyak sampel lainnya, titik akhir metadata menggunakan default mexHttpBinding, yang tidak aman. Di sini metadata diamankan menggunakan WSHttpBinding dengan keamanan Message. Agar klien metadata dapat mengambil metadata ini, mereka harus dikonfigurasi dengan pengikatan yang cocok. Sampel ini menunjukkan dua klien tersebut.

Klien pertama menggunakan Svcutil.exe untuk mengambil metadata dan menghasilkan kode dan konfigurasi klien pada waktu desain. Karena layanan menggunakan pengikatan non-default untuk metadata, alat Svcutil.exe harus dikonfigurasi secara khusus sehingga bisa mendapatkan metadata dari layanan menggunakan pengikatan tersebut.

Klien kedua menggunakan MetadataResolver untuk mengambil metadata secara dinamis untuk kontrak yang diketahui dan kemudian memanggil operasi pada klien yang dihasilkan secara dinamis.

Klien Svcutil

Saat menggunakan pengikatan default untuk menghosting titik akhir IMetadataExchange Anda, Anda dapat menjalankan Svcutil.exe dengan alamat titik akhir tersebut:

svcutil http://localhost/servicemodelsamples/service.svc/mex

dan berhasil. Tetapi dalam sampel ini, server menggunakan titik akhir non-default untuk menghosting metadata. Jadi Svcutil.exe harus diinstruksikan untuk menggunakan pengikatan yang benar. Ini dapat dilakukan menggunakan file Svcutil.exe.config.

File Svcutil.exe.config terlihat seperti file konfigurasi klien normal. Satu-satunya aspek yang tidak biasa adalah nama dan kontrak titik akhir klien:

<endpoint name="http"
          binding="wsHttpBinding"
          bindingConfiguration="Binding1"
          behaviorConfiguration="ClientCertificateBehavior"
          contract="IMetadataExchange" />

Nama titik akhir harus berupa nama skema alamat tempat metadata dihosting dan kontrak titik akhir harus IMetadataExchange. Dengan demikian, saat Svcutil.exe dijalankan dengan baris perintah seperti berikut:

svcutil http://localhost/servicemodelsamples/service.svc/mex

ia mencari titik akhir bernama "http" dan IMetadataExchange kontrak untuk mengonfigurasi pengikatan dan perilaku pertukaran komunikasi dengan titik akhir metadata. File Svcutil.exe.config lainnya dalam sampel menentukan konfigurasi pengikatan dan mandat perilaku agar sesuai dengan konfigurasi server dari titik akhir metadata.

Agar Svcutil.exe dapat mengambil konfigurasi di Svcutil.exe.config, Svcutil.exe harus berada dalam direktori yang sama dengan file konfigurasi. Akibatnya, Anda harus menyalin Svcutil.exe dari lokasi penginstalannya ke direktori yang berisi file Svcutil.exe.config. Kemudian dari direktori tersebut, jalankan perintah berikut:

.\svcutil.exe http://localhost/servicemodelsamples/service.svc/mex

Jarak antar baris ".\" memastikan bahwa salinan Svcutil.exe dalam direktori ini (yang memiliki Svcutil.exe.config yang sesuai) dijalankan.

Klien MetadataResolver

Jika klien mengetahui kontrak dan cara berbicara dengan metadata pada waktu desain, klien dapat secara dinamis mengetahui pengikatan dan alamat titik akhir aplikasi menggunakan MetadataResolver. Contoh klien ini menunjukkan ini, menunjukkan cara mengonfigurasi pengikatan dan mandat yang digunakan oleh MetadataResolver dengan membuat dan mengonfigurasi MetadataExchangeClient.

Informasi pengikatan dan sertifikat yang sama yang muncul di Svcutil.exe.config dapat ditentukan secara imperatif pada MetadataExchangeClient:

// Specify the Metadata Exchange binding and its security mode
WSHttpBinding mexBinding = new WSHttpBinding(SecurityMode.Message);
mexBinding.Security.Message.ClientCredentialType = MessageCredentialType.Certificate;

// Create a MetadataExchangeClient for retrieving metadata, and set the // certificate details
MetadataExchangeClient mexClient = new MetadataExchangeClient(mexBinding);
mexClient.SoapCredentials.ClientCertificate.SetCertificate(    StoreLocation.CurrentUser, StoreName.My,
    X509FindType.FindBySubjectName, "client.com");
mexClient.SoapCredentials.ServiceCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.PeerOrChainTrust;
mexClient.SoapCredentials.ServiceCertificate.SetDefaultCertificate(    StoreLocation.CurrentUser, StoreName.TrustedPeople,
    X509FindType.FindBySubjectName, "localhost");

Dengan dikonfigurasinya mexClient, kita dapat menghitung kontrak yang kita minati, dan menggunakan MetadataResolver untuk mengambil daftar titik akhir dengan kontrak tersebut:

// The contract we want to fetch metadata for
Collection<ContractDescription> contracts = new Collection<ContractDescription>();
ContractDescription contract = ContractDescription.GetContract(typeof(ICalculator));
contracts.Add(contract);
// Find endpoints for that contract
EndpointAddress mexAddress = new EndpointAddress(ConfigurationManager.AppSettings["mexAddress"]);
ServiceEndpointCollection endpoints = MetadataResolver.Resolve(contracts, mexAddress, mexClient);

Akhirnya kita dapat menggunakan informasi dari titik akhir tersebut untuk menginisialisasi pengikatan dan alamat ChannelFactory yang digunakan untuk membuat saluran untuk berkomunikasi dengan titik akhir aplikasi.

ChannelFactory<ICalculator> cf = new ChannelFactory<ICalculator>(endpoint.Binding, endpoint.Address);

Titik kunci dari klien sampel ini adalah untuk menunjukkan bahwa, jika Anda menggunakan MetadataResolver, dan Anda harus menentukan pengikatan atau perilaku kustom untuk komunikasi pertukaran metadata, Anda dapat menggunakan MetadataExchangeClient untuk menentukan pengaturan kustom tersebut.

Untuk menyiapkan dan membangun sampel

  1. Pastikan Anda telah melakukan Prosedur Penyiapan Satu Kali untuk Sampel WCF.

  2. Untuk membangun solusi, ikuti instruksi dalam Membangun Sampel Windows Communication Foundation.

Untuk menjalankan sampel di mesin yang sama

  1. Jalankan Setup.bat dari folder pemasangan sampel. Ini memasang semua sertifikat yang diperlukan untuk menjalankan sampel. Perhatikan bahwa Setup.bat menggunakan alat FindPrivateKey.exe, yang diinstal dengan menjalankan setupCertTool.bat dari Prosedur Penyiapan Satu Kali untuk Sampel Windows Communication Foundation.

  2. Jalankan aplikasi klien dari \MetadataResolverClient\bin atau \SvcutilClient\bin. Aktivitas klien ditampilkan pada aplikasi konsol klien.

  3. Jika klien dan layanan tidak dapat berkomunikasi, lihat Tips Pemecahan masalah untuk Sampel WCF.

  4. Hapus sertifikat dengan menjalankan Cleanup.bat setelah Anda selesai dengan sampel. Sampel keamanan lainnya menggunakan sertifikat yang sama.

Untuk menjalankan sampel di seluruh mesin

  1. Di server, jalankan setup.bat service. Menjalankan setup.bat dengan argumen service membuat sertifikat layanan dengan nama domain mesin yang sepenuhnya memenuhi syarat dan mengekspor sertifikat layanan ke file bernama Service.cer.

  2. Di server, edit Web.config untuk mencerminkan nama sertifikat baru. Artinya, ubah atribut findValue dalam elemen <serviceCertificate> menjadi nama domain komputer yang sepenuhnya memenuhi syarat.

  3. Salin file Service.cer dari direktori layanan ke direktori klien di mesin klien.

  4. Pada klien, jalankan setup.bat client. Menjalankan setup.bat dengan argumen client membuat sertifikat klien bernama Client.com dan mengekspor sertifikat klien ke file bernama Client.cer.

  5. Dalam file App.config MetadataResolverClient di mesin klien, ubah nilai alamat titik akhir mex agar sesuai dengan alamat baru layanan Anda. Lakukan ini dengan mengganti localhost dengan nama domain server yang sepenuhnya memenuhi syarat. Ubah juga kemunculan "localhost" dalam file metadataResolverClient.cs ke nama sertifikat layanan baru (nama domain server yang sepenuhnya memenuhi syarat). Lakukan hal yang sama untuk App.config proyek SvcutilClient.

  6. Salin file Client.cer dari direktori klien ke direktori layanan di server.

  7. Pada klien, jalankan ImportServiceCert.bat. Ini mengimpor sertifikat layanan dari file Service.cer ke CurrentUser - TrustedPeople store.

  8. Di server, jalankan ImportClientCert.bat, Ini mengimpor sertifikat klien dari file Client.cer ke penyimpanan LocalMachine - TrustedPeople.

  9. Pada mesin layanan, bangun proyek layanan di Visual Studio dan pilih halaman bantuan di browser web untuk memverifikasi bahwa proyek tersebut berjalan.

  10. Pada mesin klien, jalankan MetadataResolverClient atau SvcutilClient dari VS.

    1. Jika klien dan layanan tidak dapat berkomunikasi, lihat Tips Pemecahan masalah untuk Sampel WCF.

Untuk membersihkan setelah sampel

  • Jalankan Cleanup.bat di folder sampel setelah Anda selesai menjalankan sampel.

    Catatan

    Skrip ini tidak menghapus sertifikat layanan pada klien saat menjalankan sampel ini di seluruh mesin. Jika Anda telah menjalankan sampel Windows Communication Foundation (WCF) yang menggunakan sertifikat di seluruh mesin, pastikan untuk menghapus sertifikat layanan yang telah terpasang di CurrentUser - TrustedPeople store. Untuk melakukannya, gunakan perintah berikut: certmgr -del -r CurrentUser -s TrustedPeople -c -n <Fully Qualified Server Machine Name>. Misalnya: certmgr -del -r CurrentUser -s TrustedPeople -c -n server1.contoso.com.