Tentang teknologi aplikasi dan operasi:
Bahasa Pemrograman: C#
Sisi FrontEnd: Windows Presentation Foundation (WPF) - .NET Framework 4.6.1
Sisi BackEnd: Windows Communication Foundation (WCF) - .NET Framework 4.6.1
Pulihkan Paket yang diperlukan pada proyek yang dipilih, jalankan perintah berikut di Konsol PM
Update-Package -reinstall
Dalam aplikasi ini, saya akan menunjukkan cara menggunakan Otorisasi dan Otentikasi menggunakan layanan WCF dalam standar Enterprise Architecting.
WCF
Layanan Otentikasi ASP.NET
Otentikasi Kustom
Cookie HTTP
Atribut Izin Utama Otorisasi
Thread Saat IniKepala Sekolah
Pencegat Pesan
Buat Aplikasi Layanan WCF.
Tambahkan AuthenticationService.svc menggunakan kembali Layanan Otentikasi ASP.NET.
Buat kelas Validator Pengguna.
Aktifkan Otentikasi Kustom di Global.asax.
Kembalikan Cookie jika Pengguna valid.
Ubah konfigurasi layanan.
Buat ExecuteOperationsService.svc dengan tiga metode berbeda bernama SumOperation, ReadOperation, dan WriteOperation.
Hiasi Metode Layanan dengan atribut PrincipalPermission hanya untuk Akses Resmi.
Hiasi kelas ExecuteOperationsService dengan atribut AspNetCompatibilityRequirements.
Menerapkan Interceptor di Aplikasi Server.
Menerapkan kode pengaturan identitas ke Interceptors di Aplikasi Layanan.
Ubah kode sisi layanan untuk menyertakan Peran, bukan Nama.
Gunakan Tiket Terenkripsi untuk menyimpan Nama Pengguna dan Peran.
Buat Aplikasi Klien dan tambahkan referensi ke kedua layanan.
Menerapkan Interceptor di Aplikasi Klien.
Buat instance Layanan Otentikasi dan aktifkan metode Login().
Terima cookie dan simpan.
Buat instance ExecuteOperationsService dan aktifkan SumOperation, ReadOperation, dan WriteOperation.
Lampirkan Cookie ke klien ExecuteOperationsService
1. Tambahkan AuthenticationService.svc menggunakan kembali Layanan Otentikasi ASP.NET.
Tambahkan Layanan WCF baru dan beri nama AuthenticationService.svc. Hapus file terkait karena kita akan mengekspos Layanan Otentikasi ASP.NET.
Hapus AuthenticationService.cs
Hapus IAuthenticationService.cs
<%@ ServiceHost Language="C#" Service="System.Web.ApplicationServices.AuthenticationService" Factory="System.Web.ApplicationServices.ApplicationServicesHostFactory" %>
2. Aktifkan Otentikasi Kustom di Global.asax dan kembalikan Cookie jika Pengguna Valid.
Tambahkan item baru Web > Kelas Aplikasi Global ke dalam proyek.
protected void Application_Start(pengirim objek, EventArgs e) { AuthenticationService.Authenticating += AuthenticationService_Authenticating; }
private void AuthenticationService_Authenticating(pengirim objek, AuthenticatingEventArgs e) { string role = string.Empty; e.Authenticated = UserIsValid(e, peran referensi); e.AuthenticationIsComplete = benar; if (e.Authenticated) { string dienkripsiValue = FormsAuthentication.Encrypt(CreateFormsAuthenticationTicket(e, peran)); OperationContext.Current.OutgoingMessageProperties[HttpResponseMessageProperty.Name] = SetSetCookieInResponseChannelHeaders(encryptedValue); } }
Metode ini mengekstrak Nama Pengguna dan Kata Sandi dari objek Kredensial Kustom dari Argumen Peristiwa Otentikasi. Kemudian memvalidasi Nama Pengguna dan Kata Sandi dengan kelas UserValidator kami.
Properti Authenticated mewakili benar/salah jika masing-masing pengguna valid atau tidak.
3. Aktifkan Layanan Otentikasi dan Kompatibilitas ASP.NET
Sekarang kita perlu memodifikasi file web.config untuk menyertakan yang berikut:
Aktifkan Layanan Otentikasi
Aktifkan Kompatibilitas ASP.NET
<sistem.web.ekstensi> <skrip> <Layanan web> <authenticationService diaktifkan="benar"/> </Layanan Web> </skrip> </sistem.web.ekstensi>
4. Implementasi Interceptor pada Aplikasi Server.
Ini karena kode melampirkan cookie ke Konteks Operasi di atas tampaknya merupakan pekerjaan yang membosankan setiap kali kita perlu melakukan panggilan layanan. Kita dapat memindahkan tugas-tugas ini ke latar belakang menggunakan WCF Interceptors.
MSDN: Layanan Data WCF memungkinkan aplikasi mencegat pesan permintaan sehingga Anda dapat menambahkan logika khusus ke operasi. Anda dapat menggunakan logika khusus ini untuk memvalidasi data dalam pesan masuk. Anda juga dapat menggunakannya untuk lebih membatasi cakupan permintaan kueri, seperti memasukkan kebijakan otorisasi khusus berdasarkan permintaan.
Berikut ini adalah kegiatan yang terlibat dalam langkah ini.
Tambahkan Perilaku Interceptor di dalam Server web.config.
Buat kelas Perilaku Interceptor. (Lihat di proyek)
Buat kelas IdentityMessageInspector . (Lihat di proyek)
<sistem.layananModel> <layanan> <nama layanan="AuthenticationAndAuthorization.ExecuteOperationsService" behaviorConfiguration="InterceptorBehavior" /> </layanan> <perilaku> <perilaku layanan> <perilaku> <serviceMetadata httpGetEnabled="benar" /> <serviceDebug includeExceptionDetailInFaults="benar" /> </perilaku> <nama perilaku="InterceptorBehavior"> <serviceDebug includeExceptionDetailInFaults="benar" /> <interceptorBehaviorExtension /> </perilaku> </perilaku layanan> </perilaku> <ekstensi> <behaviorExtensions> <tambahkan nama="interceptorBehaviorExtension" type="AuthenticationAndAuthorization.Extensions.IDispatchMessageInspector.InterceptorBehaviorExtension, AuthenticationAndAuthorization, Versi=1.0.0.0, Budaya=netral"/> </behaviorExtensions> </ekstensi> <serviceHostingEnvironment aspNetCompatibilityEnabled="benar" multipleSiteBindingsEnabled="benar" /> </sistem.serviceModel>
5. Enkripsi Kue.
Cookie kami berisi informasi yang mudah dibaca oleh HTTP Examining Utilities seperti Fiddler. Hal ini membuat informasi cookie rentan terhadap ancaman keamanan.
FormsAuthenticationTicket : Namespace System.Web.Security menyediakan kelas yang nyaman bagi kami. Kita dapat menyimpan informasi nama pengguna dan peran di dalam instance kelas ini. Kelas tiket juga menyediakan fasilitas kadaluarsa dan enkripsi.
private FormsAuthenticationTicket CreateFormsAuthenticationTicket(AuthenticatingEventArgs e, peran string) => new FormsAuthenticationTicket(1, e.UserName, DateTime.Now, DateTime.Now.AddHours(24), true, role, FormsAuthentication.FormsCookiePath);
string terenkripsiValue = FormsAuthentication.Encrypt(CreateFormsAuthenticationTicket(e, peran)); FormsAuthenticationTicket pribadi GetDecryptTicket(string terenkripsiTicket) => FormsAuthentication.Decrypt(encryptedTicket);
pribadi HttpResponseMessageProperty SetSetCookieInResponseChannelHeaders(string cookieValue) { HttpResponseMessageProperty respon = HttpResponseMessageProperty() baru; respon.Headers[HttpResponseHeader.SetCookie] = FormsAuthentication.FormsCookieName + "=" + cookieValue; respons balasan; }
<mode autentikasi="Formulir"> <forms slidingExpiration="true" name="AuthCookie" proteksi="Semua" timeout="20"/> </otentikasi> <machineKey decryption="AES" validation="SHA1" decryptionKey="1523F567EE75F7FB5AC0AC4D79E1D9F25430E3E2F1BCDD3370BCFC4EFC97A541" validationKey="33CBA563F26041EE5B5FE9581076C40618DCC1218F5F447634EDE8624508A129"/>
6. Menerapkan Interceptor pada Aplikasi Klien.
Berikut ini adalah kegiatan yang terlibat dalam langkah ini.
Tambahkan Perilaku Interceptor di dalam Client App.config
Buat kelas Perilaku Interceptor. (Lihat di proyek)
Buat kelas CookieMessageInspector . (Lihat di proyek)
<perilaku> <Perilaku Titik Akhir> <nama perilaku ="InterceptorBehavior"> <interceptorBehaviorExtension /> </perilaku> </perilaku titik akhir> </perilaku>
<alamat titik akhir="http://localhost:8046/ExecuteOperationsService.svc" binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IExecuteOperationsService" contract="ExecuteOperationsServiceReference.IExecuteOperationsService" name="BasicHttpBinding_IExecuteOperationsService" behaviorConfiguration="InterceptorBehavior"/>