Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Sampel TrustedFacade menunjukkan cara mengalirkan informasi identitas pemanggil dari satu layanan ke layanan lain menggunakan infrastruktur keamanan Windows Communication Foundation (WCF).
Ini adalah pola desain umum untuk mengekspos fungsionalitas yang disediakan oleh layanan ke jaringan publik menggunakan layanan fasad. Layanan fasad biasanya berada di jaringan perimeter (juga dikenal sebagai DMZ, zona demiliterisasi, dan subnet yang disaring) dan berkomunikasi dengan layanan backend yang mengimplementasikan logika bisnis dan memiliki akses ke data internal. Saluran komunikasi antara layanan fasad dan layanan backend melewati firewall dan biasanya terbatas hanya untuk satu tujuan.
Sampel ini terdiri dari komponen-komponen berikut:
Klien kalkulator
Layanan antarmuka kalkulator
Layanan backend kalkulator
Layanan fasad bertanggung jawab untuk memvalidasi permintaan dan mengautentikasi pemanggil. Setelah autentikasi dan validasi berhasil, ia meneruskan permintaan ke layanan backend menggunakan saluran komunikasi terkontrol dari jaringan perimeter ke jaringan internal. Sebagai bagian dari permintaan yang diteruskan, layanan fasad menyertakan informasi tentang identitas pemanggil sehingga layanan backend dapat menggunakan informasi ini dalam pemrosesannya. Identitas pemanggil ditransmisikan menggunakan Username token keamanan di dalam header pesan Security . Sampel menggunakan infrastruktur keamanan WCF untuk mengirimkan dan mengekstrak informasi ini dari Security header.
Penting
Layanan backend mempercayai layanan fasad untuk mengautentikasi pemanggil. Karena itu, layanan backend tidak mengautentikasi penelepon lagi; ia menggunakan data identitas yang disediakan oleh layanan fasade dalam permintaan yang diteruskan. Karena hubungan kepercayaan ini, layanan backend harus mengautentikasi layanan fasad untuk memastikan bahwa pesan yang diteruskan berasal dari sumber tepercaya - dalam hal ini, layanan fasad.
Pelaksanaan
Ada dua jalur komunikasi dalam sampel ini. Pertama adalah antara klien dan layanan fasad, yang kedua adalah antara layanan fasad dan layanan backend.
Jalur Komunikasi antara Klien dan Layanan Fasad
Jalur komunikasi dari klien ke layanan fasad wsHttpBinding menggunakan UserName jenis kredensial klien. Ini berarti bahwa klien menggunakan nama pengguna dan kata sandi untuk mengautentikasi ke layanan fasad dan layanan fasad menggunakan sertifikat X.509 untuk mengautentikasi ke klien. Konfigurasi pengikatan terlihat seperti contoh berikut.
<bindings>
<wsHttpBinding>
<binding name="Binding1">
<security mode="Message">
<message clientCredentialType="UserName"/>
</security>
</binding>
</wsHttpBinding>
</bindings>
Layanan fasad mengautentikasi pemanggil menggunakan implementasi kustom UserNamePasswordValidator . Untuk tujuan demonstrasi, autentikasi hanya memastikan bahwa nama pengguna penelepon cocok dengan kata sandi yang disajikan. Dalam situasi dunia nyata, pengguna mungkin diautentikasi menggunakan Direktori Aktif atau penyedia Keanggotaan ASP.NET kustom. Implementasi validator berada dalam FacadeService.cs file.
public class MyUserNamePasswordValidator : UserNamePasswordValidator
{
public override void Validate(string userName, string password)
{
// check that username matches password
if (null == userName || userName != password)
{
Console.WriteLine("Invalid username or password");
throw new SecurityTokenValidationException(
"Invalid username or password");
}
}
}
Validator kustom dikonfigurasi untuk digunakan di dalam perilaku serviceCredentials dalam file konfigurasi layanan antarmuka. Perilaku ini juga digunakan untuk mengonfigurasi sertifikat X.509 layanan.
<behaviors>
<serviceBehaviors>
<behavior name="FacadeServiceBehavior">
<!--The serviceCredentials behavior allows you to define -->
<!--a service certificate. -->
<!--A service certificate is used by the service to -->
<!--authenticate itself to its clients and to provide -->
<!--message protection. -->
<!--This configuration references the "localhost" -->
<!--certificate installed during the setup instructions. -->
<serviceCredentials>
<serviceCertificate
findValue="localhost"
storeLocation="LocalMachine"
storeName="My"
x509FindType="FindBySubjectName" />
<userNameAuthentication userNamePasswordValidationMode="Custom"
customUserNamePasswordValidatorType=
"Microsoft.ServiceModel.Samples.MyUserNamePasswordValidator,
FacadeService"/>
</serviceCredentials>
</behavior>
</serviceBehaviors>
</behaviors>
Jalur Komunikasi antara Layanan Fasad dan Layanan Backend
Layanan fasad ke jalur komunikasi layanan backend menggunakan customBinding yang terdiri dari beberapa elemen pengikatan. Pengikatan ini mencapai dua hal. Ini mengautentikasi layanan fasad dan layanan backend untuk memastikan bahwa komunikasi aman dan berasal dari sumber tepercaya. Selain itu, ini juga mengirimkan identitas pemanggil awal ke dalam token keamanan Username. Dalam hal ini, hanya nama pengguna pemanggil awal yang dikirimkan ke layanan backend, kata sandi tidak disertakan dalam pesan. Ini karena layanan backend mempercayai layanan fasad untuk mengautentikasi penelepon sebelum meneruskan permintaan ke layanan tersebut. Karena layanan fasad mengautentikasi dirinya ke layanan backend, layanan backend dapat mempercayai informasi yang terkandung dalam permintaan yang diteruskan.
Berikut ini adalah konfigurasi pengikatan untuk jalur komunikasi ini.
<bindings>
<customBinding>
<binding name="ClientBinding">
<security authenticationMode="UserNameOverTransport"/>
<windowsStreamSecurity/>
<tcpTransport/>
</binding>
</customBinding>
</bindings>
Elemen <pengikatan keamanan> mengurus transmisi dan ekstraksi nama pengguna pemanggil awal. <WindowsStreamSecurity> dan <tcpTransport> mengurus autentikasi fasad dan layanan backend dan perlindungan pesan.
Untuk meneruskan permintaan, implementasi layanan fasad harus memberikan nama pengguna pemanggil awal sehingga infrastruktur keamanan WCF dapat menempatkan ini ke dalam pesan yang diteruskan. Nama pengguna pemanggil awal disediakan dalam implementasi layanan fasad dengan mengaturnya di ClientCredentials properti pada instans proksi klien yang digunakan layanan fasad untuk berkomunikasi dengan layanan backend.
Kode berikut menunjukkan bagaimana GetCallerIdentity metode diimplementasikan pada layanan fasad. Metode lain menggunakan pola yang sama.
public string GetCallerIdentity()
{
CalculatorClient client = new CalculatorClient();
client.ClientCredentials.UserName.UserName = ServiceSecurityContext.Current.PrimaryIdentity.Name;
string result = client.GetCallerIdentity();
client.Close();
return result;
}
Seperti yang ditunjukkan pada kode sebelumnya, kata sandi tidak diatur pada ClientCredentials properti , hanya nama pengguna yang diatur. Infrastruktur keamanan WCF membuat token keamanan nama pengguna tanpa kata sandi dalam hal ini, yang merupakan apa yang diperlukan dalam skenario ini.
Pada layanan backend, informasi yang terkandung dalam token keamanan nama pengguna harus diautentikasi. Secara default, keamanan WCF mencoba memetakan pengguna ke akun Windows menggunakan kata sandi yang disediakan. Dalam hal ini, tidak ada kata sandi yang disediakan dan layanan backend tidak diperlukan untuk mengautentikasi nama pengguna karena autentikasi sudah dilakukan oleh layanan fasad. Untuk menerapkan fungsionalitas ini di WCF, kustom UserNamePasswordValidator disediakan yang hanya memberlakukan bahwa nama pengguna ditentukan dalam token dan tidak melakukan autentikasi tambahan apa pun.
public class MyUserNamePasswordValidator : UserNamePasswordValidator
{
public override void Validate(string userName, string password)
{
// Ignore the password because it is empty,
// we trust the facade service to authenticate the client.
// Accept the username information here so that the
// application gets access to it.
if (null == userName)
{
Console.WriteLine("Invalid username");
throw new
SecurityTokenValidationException("Invalid username");
}
}
}
Validator kustom dikonfigurasi untuk digunakan di dalam perilaku serviceCredentials dalam file konfigurasi layanan antarmuka.
<behaviors>
<serviceBehaviors>
<behavior name="BackendServiceBehavior">
<serviceCredentials>
<userNameAuthentication userNamePasswordValidationMode="Custom"
customUserNamePasswordValidatorType=
"Microsoft.ServiceModel.Samples.MyUserNamePasswordValidator,
BackendService"/>
</serviceCredentials>
</behavior>
</serviceBehaviors>
</behaviors>
Untuk mengekstrak informasi nama pengguna serta informasi tentang akun layanan fasad tepercaya, implementasi layanan backend menggunakan kelas ServiceSecurityContext. Kode berikut menunjukkan bagaimana metode GetCallerIdentity diimplementasikan.
public string GetCallerIdentity()
{
// Facade service is authenticated using Windows authentication.
//Its identity is accessible.
// On ServiceSecurityContext.Current.WindowsIdentity.
string facadeServiceIdentityName =
ServiceSecurityContext.Current.WindowsIdentity.Name;
// The client name is transmitted using Username authentication on
//the message level without the password
// using a supporting encrypted UserNameToken.
// Claims extracted from this supporting token are available in
// ServiceSecurityContext.Current.AuthorizationContext.ClaimSets
// collection.
string clientName = null;
foreach (ClaimSet claimSet in
ServiceSecurityContext.Current.AuthorizationContext.ClaimSets)
{
foreach (Claim claim in claimSet)
{
if (claim.ClaimType == ClaimTypes.Name &&
claim.Right == Rights.Identity)
{
clientName = (string)claim.Resource;
break;
}
}
}
if (clientName == null)
{
// In case there was no UserNameToken attached to the request.
// In the real world implementation the service should reject
// this request.
return "Anonymous caller via " + facadeServiceIdentityName;
}
return clientName + " via " + facadeServiceIdentityName;
}
Informasi akun layanan fasad diekstrak menggunakan properti ServiceSecurityContext.Current.WindowsIdentity. Untuk mengakses informasi tentang pemanggil awal, layanan backend menggunakan ServiceSecurityContext.Current.AuthorizationContext.ClaimSets properti . Ini menemukan sebuah Identity klaim dengan jenis Name. Klaim ini secara otomatis dihasilkan oleh infrastruktur keamanan WCF dari informasi yang terkandung dalam Username token keamanan.
Menjalankan sampel
Saat Anda menjalankan sampel, permintaan dan respons operasi ditampilkan di jendela konsol klien. Tekan ENTER di jendela klien untuk mematikan klien. Anda dapat menekan ENTER di jendela fasad dan konsol layanan backend untuk mematikan layanan.
Username authentication required.
Provide a valid machine or domain ac
Enter username:
user
Enter password:
****
user via MyMachine\testaccount
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 skenario Facade Tepercaya memungkinkan Anda mengonfigurasi server dengan sertifikat yang relevan untuk menjalankan layanan fasad yang memerlukan keamanan berbasis sertifikat untuk mengautentikasi dirinya sendiri ke klien. Lihat prosedur penyiapan di akhir topik ini untuk detailnya.
Berikut ini memberikan gambaran singkat tentang berbagai bagian file batch.
Membuat sertifikat server.
Baris berikut dari file batch Setup.bat 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 -peVariabel
%SERVER_NAME%menentukan nama server - nilai defaultnya adalah localhost. Sertifikat disimpan di penyimpanan LocalMachine.Menginstal sertifikat layanan fasad ke penyimpanan sertifikat tepercaya klien.
Baris berikut menyalin sertifikat layanan fasad 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 berakar pada sertifikat akar tepercaya klien—misalnya, sertifikat yang dikeluarkan Microsoft—langkah mengisi penyimpanan sertifikat klien dengan sertifikat server tidak diperlukan.
certmgr.exe -add -r LocalMachine -s My -c -n %SERVER_NAME% -r CurrentUser -s TrustedPeople
Untuk menyiapkan, mengompilasi, dan menjalankan sampel
Pastikan Anda telah melakukan Prosedur Penyiapan One-Time untuk Sampel Windows Communication Foundation.
Untuk membangun solusi edisi C# atau Visual Basic .NET, ikuti instruksi di Membangun Sampel Windows Communication Foundation.
Untuk menjalankan sampel pada komputer yang sama
Pastikan jalur menyertakan folder tempat Makecert.exe berada.
Jalankan Setup.bat dari folder instalasi sampel. Ini menginstal semua sertifikat yang diperlukan untuk menjalankan sampel.
Luncurkan BackendService.exe dari direktori \BackendService\bin di jendela konsol terpisah
Luncurkan FacadeService.exe dari direktori \FacadeService\bin di jendela konsol terpisah
Luncurkan Client.exe dari \client\bin. Aktivitas klien ditampilkan pada aplikasi konsol klien.
Jika klien dan layanan tidak dapat berkomunikasi, lihat Tips Pemecahan Masalah untuk Sampel WCF.
Untuk membersihkan setelah pengujian sampel
- Jalankan Cleanup.bat di folder sampel setelah Anda selesai menjalankan sampel.