Keamanan Pesan Anonim
Contoh Keamanan Pesan Anonim menunjukkan cara menerapkan aplikasi Windows Communication Foundation (WCF) yang menggunakan keamanan tingkat pesan tanpa autentikasi klien tetapi memerlukan autentikasi server menggunakan sertifikat X.509 server. Semua pesan aplikasi antara klien dan server ditandatangani dan dienkripsi. Sampel ini didasarkan pada sampel WSHttpBinding . Sampel ini terdiri dari program konsol klien (.exe) dan pustaka layanan (.dll) yang dihosting oleh Layanan Informasi Internet (IIS). Layanan tersebut mengimplementasikan kontrak yang mendefinisikan pola komunikasi balasan permintaan.
Catatan
Prosedur penyiapan dan petunjuk pembuatan untuk sampel ini terdapat di akhir topik ini.
Contoh ini menambahkan operasi baru ke antarmuka kalkulator yang mengembalikan True
jika klien tidak diautentikasi.
public class CalculatorService : ICalculator
{
public bool IsCallerAnonymous()
{
// ServiceSecurityContext.IsAnonymous returns true if the caller is not authenticated.
return ServiceSecurityContext.Current.IsAnonymous;
}
...
}
Layanan ini mengekspos satu titik akhir untuk berkomunikasi dengan layanan, yang ditentukan menggunakan file konfigurasi (Web.config). Titik akhir terdiri dari alamat, pengikatan, dan kontrak. Pengikatan dikonfigurasi dengan pengikatan wsHttpBinding
. Mode keamanan default untuk pengikatan wsHttpBinding
adalah Message
. Atribut clientCredentialType
diatur ke None
.
<system.serviceModel>
<protocolMapping>
<add scheme="http" binding="wsHttpBinding" />
</protocolMapping>
<bindings>
<wsHttpBinding>
<!-- This configuration defines the security mode as Message and -->
<!-- the clientCredentialType as None. This mode provides -->
<!-- server authentication only using the service certificate. -->
<binding>
<security mode="Message">
<message clientCredentialType="None" />
</security>
</binding>
</wsHttpBinding>
</bindings>
...
</system.serviceModel>
Kredensial yang akan digunakan untuk autentikasi layanan ditentukan dalam <perilaku>. Sertifikat server harus berisi nilai yang sama untuk SubjectName
sebagai nilai yang ditentukan untuk atribut findValue
seperti yang ditunjukkan dalam kode sampel berikut.
<behaviors>
<serviceBehaviors>
<behavior>
<!--
The serviceCredentials behavior allows you to define a service certificate.
A service certificate is used by a client to authenticate the service and provide message protection.
This configuration references the "localhost" certificate installed during the setup instructions.
-->
<serviceCredentials>
<serviceCertificate findValue="localhost" storeLocation="LocalMachine" storeName="My" x509FindType="FindBySubjectName" />
</serviceCredentials>
<serviceMetadata httpGetEnabled="True"/>
<serviceDebug includeExceptionDetailInFaults="False" />
</behavior>
</serviceBehaviors>
</behaviors>
Konfigurasi titik akhir klien terdiri dari alamat absolut untuk titik akhir layanan, pengikatan, dan kontrak. Mode keamanan klien untuk pengikatan wsHttpBinding
adalah Message
. Atribut clientCredentialType
diatur ke None
.
<system.serviceModel>
<client>
<endpoint name=""
address="http://localhost/servicemodelsamples/service.svc"
binding="wsHttpBinding"
behaviorConfiguration="ClientCredentialsBehavior"
bindingConfiguration="Binding1"
contract="Microsoft.ServiceModel.Samples.ICalculator" />
</client>
<bindings>
<wsHttpBinding>
<!--This configuration defines the security mode as -->
<!--Message and the clientCredentialType as None. -->
<binding name="Binding1">
<security mode = "Message">
<message clientCredentialType="None"/>
</security>
</binding>
</wsHttpBinding>
</bindings>
...
</system.serviceModel>
Sampel mengatur CertificateValidationMode ke PeerOrChainTrust untuk mengautentikasi sertifikat layanan. Ini dilakukan dalam file App.config klien di bagian behaviors
. Ini berarti bahwa jika sertifikat ada di toko Orang Tepercaya pengguna, maka sertifikat tersebut tepercaya tanpa melakukan validasi rantai penerbit sertifikat. Pengaturan ini digunakan di sini untuk kenyamanan sehingga sampel dapat dijalankan tanpa memerlukan sertifikat yang dikeluarkan oleh otoritas sertifikasi (CA). Pengaturan ini kurang aman dibandingkan default, yaitu ChainTrust. Implikasi keamanan dari pengaturan ini harus dipertimbangkan dengan cermat sebelum digunakan PeerOrChainTrust
dalam kode produksi.
Implementasi klien menambahkan panggilan ke IsCallerAnonymous
metode dan sebaliknya tidak berbeda dari sampel WSHttpBinding .
// Create a client with a client endpoint configuration.
CalculatorClient client = new CalculatorClient();
// Call the GetCallerIdentity operation.
Console.WriteLine("IsCallerAnonymous returned: {0}", client.IsCallerAnonymous());
// Call the Add service operation.
double value1 = 100.00D;
double value2 = 15.99D;
double result = client.Add(value1, value2);
Console.WriteLine("Add({0},{1}) = {2}", value1, value2, result);
...
//Closing the client gracefully closes the connection and cleans up resources.
client.Close();
Console.WriteLine();
Console.WriteLine("Press <ENTER> to terminate client.");
Console.ReadLine();
Saat Anda menjalankan sampel, permintaan dan respons operasi ditampilkan di jendela konsol klien. Tekan ENTER di jendela klien untuk mematikan komputer klien.
IsCallerAnonymous returned: True
Add(100,15.99) = 115.99
Subtract(145,76.54) = 68.46
Multiply(9,81.25) = 731.25
Divide(22,7) = 3.14285714285714
Press <ENTER> to terminate client.
File batch Setup.bat yang disertakan dengan sampel Keamanan Pesan Anonim memungkinkan Anda mengonfigurasi server dengan sertifikat yang relevan untuk menjalankan aplikasi yang dihosting yang memerlukan keamanan berbasis sertifikat. File batch dapat dijalankan dalam dua mode. Untuk menjalankan file batch dalam mode komputer tunggal, ketik setup.bat
di baris perintah. Untuk menjalankannya dalam mode layanan, ketik setup.bat service
. Gunakan mode ini saat menjalankan sampel di seluruh komputer. Lihat prosedur penyiapan di akhir topik ini untuk mengetahui detailnya.
Berikut ini memberikan gambaran singkat tentang berbagai bagian file batch:
Membuat sertifikat server.
Baris dari file batch Setup.bat berikut membuat sertifikat server yang akan digunakan.
echo ************ echo Server cert setup starting echo %SERVER_NAME% echo ************ echo making server cert echo ************ makecert.exe -sr LocalMachine -ss MY -a sha1 -n CN=%SERVER_NAME% -sky exchange -pe
Variabel %SERVER_NAME% menentukan nama server. Sertifikat tersebut disimpan di penyimpanan LocalMachine. Jika berkas kumpulan penyiapan dijalankan dengan argumen layanan (seperti
setup.bat service
), %SERVER_NAME% berisi nama domain komputer yang sepenuhnya memenuhi syarat. Jika tidak, defaultnya ke localhost.Menginstal sertifikat server ke penyimpanan sertifikat tepercaya klien.
Baris berikut menyalin sertifikat server ke penyimpanan orang tepercaya klien. Langkah ini diperlukan karena sertifikat yang dihasilkan oleh Makecert.exe tidak dipercaya secara implisit oleh sistem klien. Jika Anda sudah memiliki sertifikat yang di-root di sertifikat root tepercaya klien—misalnya, sertifikat yang diterbitkan Microsoft—langkah mengisi penyimpanan sertifikat klien dengan sertifikat server ini tidak diperlukan.
certmgr.exe -add -r LocalMachine -s My -c -n %SERVER_NAME% -r CurrentUser -s TrustedPeople
Memberikan izin pada kunci pribadi sertifikat.
Baris berikut pada file batch Setup.bat membuat sertifikat server yang disimpan di penyimpanan LocalMachine dapat diakses oleh akun proses pekerja ASP.NET.
echo ************ echo setting privileges on server certificates echo ************ for /F "delims=" %%i in ('"%MSSDK%\bin\FindPrivateKey.exe" My LocalMachine -n CN^=%SERVER_NAME% -a') do set PRIVATE_KEY_FILE=%%i set WP_ACCOUNT=NT AUTHORITY\NETWORK SERVICE (ver | findstr "5.1") && set WP_ACCOUNT=%COMPUTERNAME%\ASPNET echo Y|cacls.exe "%PRIVATE_KEY_FILE%" /E /G "%WP_ACCOUNT%":R iisreset
Catatan
Jika Anda menggunakan Windows edisi bahasa Inggris non-AS, Anda harus mengedit file Setup.bat dan mengganti nama akun NT AUTHORITY\NETWORK SERVICE
dengan nama regional yang setara.
Untuk menyiapkan, membangun, dan menjalankan sampel
Pastikan Anda telah melakukan Prosedur Penyiapan Satu Kali untuk Sampel Windows Communication Foundation.
Untuk membangun solusi edisi C# atau Visual Basic .NET, ikuti petunjuknya di Membangun Sampel WCF.
Untuk menjalankan sampel di komputer yang sama
Pastikan jalur tersebut menyertakan folder tempat Makecert.exe dan FindPrivateKey.exe.
Jalankan Setup.bat dari folder instalasi sampel di Perintah Pengembang untuk Visual Studio yang dijalankan dengan hak administrator. Ini memasang semua sertifikat yang diperlukan untuk menjalankan sampel.
Catatan
File batch penyiapan dirancang untuk dijalankan dari Perintah Pengembang untuk Visual Studio. Ini mengharuskan variabel lingkungan jalur menunjuk ke direktori tempat SDK diinstal. Variabel lingkungan ini secara otomatis diatur dalam Perintah Pengembang untuk Visual Studio.
Verifikasi akses ke layanan menggunakan browser dengan memasukkan alamat
http://localhost/servicemodelsamples/service.svc
.Luncurkan Client.exe dari \client\bin. Aktivitas klien ditampilkan di aplikasi konsol klien.
Jika klien dan layanan tidak dapat berkomunikasi, lihat Tips Pemecahan Masalah untuk Sampel WCF.
Untuk menjalankan sampel di seluruh komputer
Buat direktori di komputer layanan. Buat aplikasi virtual bernama servicemodelsamples untuk direktori ini menggunakan alat manajemen Layanan informasi Internet (IIS).
Salin file program layanan dari \inetpub\wwwroot\servicemodelsamples ke direktori virtual di komputer layanan. Pastikan Anda menyalin file di subdirektori \bin. Salin juga file Setup.bat dan Cleanup.bat ke komputer layanan.
Buat direktori di komputer klien untuk binari klien.
Salin file program klien ke direktori klien di komputer klien. Salin juga file Setup.bat, Cleanup.bat, dan ImportServiceCert.bat ke klien.
Di server, jalankan
setup.bat service
di Perintah Pengembang untuk Visual Studio yang dibuka dengan hak istimewa administrator. Menjalankansetup.bat
dengan argumenservice
akan membuat sertifikat layanan dengan nama domain komputer yang sepenuhnya memenuhi syarat dan mengekspor sertifikat layanan ke file yang dinamai Service.cer.Edit Web.config untuk mencerminkan nama sertifikat baru (dalam atribut
findValue
di <serviceCertificate>), yang sama dengan nama domain komputer yang sepenuhnya memenuhi syarat.Salin file Service.cer dari direktori layanan ke direktori klien di komputer klien.
Di file Client.exe.config di komputer klien, ubah nilai alamat titik akhir agar sesuai dengan alamat baru layanan Anda.
Di klien, jalankan ImportServiceCert.bat di Perintah Pengembang untuk Visual Studio yang dibuka dengan hak istimewa administrator. Langkah ini mengimpor sertifikat layanan dari file Service.cer ke penyimpanan CurrentUser - TrustedPeople.
Di komputer klien, luncurkan Client.exe dari perintah. Jika klien dan layanan tidak dapat berkomunikasi, lihat Tips Pemecahan Masalah untuk Sampel WCF.
Untuk membersihkan 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 komputer. Jika Anda telah menjalankan sampel Windows Communication Foundation (WCF) yang menggunakan sertifikat di seluruh komputer, pastikan untuk menghapus sertifikat layanan yang telah terpasang di penyimpanan CurrentUser - TrustedPeople. Untuk melakukannya, gunakan perinta: 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.