Berbagi sertifikat antar aplikasi
aplikasi Platform Windows Universal (UWP) yang memerlukan autentikasi aman di luar id pengguna dan kombinasi kata sandi dapat menggunakan sertifikat untuk autentikasi. Autentikasi sertifikat memberikan tingkat kepercayaan yang tinggi saat mengautentikasi pengguna. Dalam beberapa kasus, sekelompok layanan akan ingin mengautentikasi pengguna untuk beberapa aplikasi. Artikel ini memperlihatkan bagaimana Anda dapat mengautentikasi beberapa aplikasi menggunakan sertifikat yang sama, dan bagaimana Anda dapat menyediakan kode yang nyaman bagi pengguna untuk mengimpor sertifikat yang disediakan untuk mengakses layanan web aman.
Aplikasi dapat mengautentikasi ke layanan web menggunakan sertifikat, dan beberapa aplikasi dapat menggunakan satu sertifikat dari penyimpanan sertifikat untuk mengautentikasi pengguna yang sama. Jika sertifikat tidak ada di penyimpanan, Anda dapat menambahkan kode ke aplikasi Anda untuk mengimpor sertifikat dari file PFX.
Mengaktifkan microsoft Layanan Informasi Internet (IIS) dan pemetaan sertifikat klien
Artikel ini menggunakan Microsoft Layanan Informasi Internet (IIS) untuk tujuan contoh. IIS tidak diaktifkan secara default. Anda dapat mengaktifkan IIS dengan menggunakan Panel Kontrol.
- Buka Panel Kontrol dan pilih Program.
- Pilih Aktifkan atau nonaktifkan fitur Windows.
- Perluas Layanan Informasi Internet lalu perluas World Wide Web Services. Perluas Fitur Pengembangan Aplikasi dan pilih ASP.NET 3.5 dan ASP.NET 4.5. Membuat pilihan ini akan secara otomatis mengaktifkan Layanan Informasi Internet.
- Klik OK untuk menerapkan perubahan.
Membuat dan menerbitkan layanan web aman
Jalankan Microsoft Visual Studio sebagai administrator dan pilih Proyek Baru dari halaman mulai. Akses administrator diperlukan untuk menerbitkan layanan web ke server IIS. Dalam dialog Proyek Baru, ubah kerangka kerja menjadi .NET Framework 3.5. Pilih Visual C# ->Web ->Visual Studio ->ASP.NET Aplikasi Layanan Web. Beri nama aplikasi "FirstContosoBank". Pilih OK untuk membuat proyek.
Dalam file Service1.asmx.cs, ganti metode web HelloWorld default dengan metode "Login" berikut.
[WebMethod] public string Login() { // Verify certificate with CA var cert = new System.Security.Cryptography.X509Certificates.X509Certificate2( this.Context.Request.ClientCertificate.Certificate); bool test = cert.Verify(); return test.ToString(); }
Simpan file Service1.asmx.cs.
Di Penjelajah Solusi, klik kanan aplikasi "FirstContosoBank" dan pilih Terbitkan.
Dalam dialog Terbitkan Web, buat profil baru dan beri nama "ContosoProfile". Klik Berikutnya.
Pada halaman berikutnya, masukkan nama server untuk server IIS Anda, dan tentukan nama situs "Situs Web Default/FirstContosoBank". Klik Terbitkan untuk menerbitkan layanan web Anda.
Mengonfigurasi layanan web Anda untuk menggunakan autentikasi sertifikat klien
- Jalankan Manajer Layanan Informasi Internet (IIS).
- Perluas situs untuk server IIS Anda. Di bawah Situs Web Default, pilih layanan web "FirstContosoBank" baru. Di bagian Tindakan, pilih Pengaturan Tingkat Lanjut....
- Atur Kumpulan Aplikasi ke .NET v2.0 dan klik OK.
- Di Manajer Layanan Informasi Internet (IIS), pilih server IIS Anda lalu klik dua kali Sertifikat Server. Di bagian Tindakan, pilih Buat Sertifikat yang Ditandatangani Sendiri.... Masukkan "ContosoBank" sebagai nama yang mudah diingat untuk sertifikat dan klik OK. Ini akan membuat sertifikat baru untuk digunakan oleh server IIS dalam bentuk "<server-name>.<domain-name>".
- Di Manajer Layanan Informasi Internet (IIS), pilih situs web default. Di bagian Tindakan , pilih Pengikatan lalu klik Tambahkan.... Pilih "https" sebagai jenis, atur port ke "443", dan masukkan nama host lengkap untuk server IIS Anda ("<nama> server.<domain-name>"). Atur sertifikat SSL ke "ContosoBank". Klik OK. Klik Tutup di jendela Pengikatan Situs.
- Di Manajer Layanan Informasi Internet (IIS), pilih layanan web "FirstContosoBank". Klik dua kali Pengaturan SSL. Periksa Memerlukan SSL. Di bawah Sertifikat klien, pilih Wajibkan. Di bagian Tindakan, klik Terapkan.
- Anda dapat memverifikasi bahwa layanan web dikonfigurasi dengan benar dengan membuka browser web Anda dan memasukkan alamat web berikut: "https://< server-name>.<domain-name>/FirstContosoBank/Service1.asmx". Misalnya, "https://myserver.example.com/FirstContosoBank/Service1.asmx". Jika layanan web Anda dikonfigurasi dengan benar, Anda akan diminta untuk memilih sertifikat klien untuk mengakses layanan web.
Anda dapat mengulangi langkah-langkah sebelumnya untuk membuat beberapa layanan web yang dapat diakses menggunakan sertifikat klien yang sama.
Membuat aplikasi UWP yang menggunakan autentikasi sertifikat
Sekarang setelah Anda memiliki satu atau beberapa layanan web yang aman, aplikasi Anda dapat menggunakan sertifikat untuk mengautentikasi ke layanan web tersebut. Saat Anda membuat permintaan ke layanan web terautentikasi menggunakan objek HttpClient , permintaan awal tidak akan berisi sertifikat klien. Layanan web yang diautentikasi akan merespons dengan permintaan untuk autentikasi klien. Ketika ini terjadi, klien Windows akan secara otomatis meminta penyimpanan sertifikat untuk sertifikat klien yang tersedia. Pengguna Anda dapat memilih dari sertifikat ini untuk mengautentikasi ke layanan web. Beberapa sertifikat dilindungi kata sandi, jadi Anda harus memberi pengguna cara untuk memasukkan kata sandi untuk sertifikat.
Jika tidak ada sertifikat klien yang tersedia, maka pengguna harus menambahkan sertifikat ke penyimpanan sertifikat. Anda dapat menyertakan kode di aplikasi yang memungkinkan pengguna memilih file PFX yang berisi sertifikat klien lalu mengimpor sertifikat tersebut ke penyimpanan sertifikat klien.
Tips Anda dapat menggunakan makecert.exe untuk membuat file PFX untuk digunakan dengan mulai cepat ini. Untuk informasi tentang menggunakan makecert.exe, lihat MakeCert.
Buka Visual Studio dan buat proyek baru dari halaman mulai. Beri nama proyek baru "FirstContosoBankApp". Klik OK untuk membuat proyek baru.
Dalam file MainPage.xaml, tambahkan XAML berikut ke elemen Grid default. XAML ini menyertakan tombol untuk menelusuri file PFX yang akan diimpor, kotak teks untuk memasukkan kata sandi untuk file PFX yang dilindungi kata sandi, tombol untuk mengimpor file PFX yang dipilih, tombol untuk masuk ke layanan web aman, dan blok teks untuk menampilkan status tindakan saat ini.
<Button x:Name="Import" Content="Import Certificate (PFX file)" HorizontalAlignment="Left" Margin="352,305,0,0" VerticalAlignment="Top" Height="77" Width="260" Click="Import_Click" FontSize="16"/> <Button x:Name="Login" Content="Login" HorizontalAlignment="Left" Margin="611,305,0,0" VerticalAlignment="Top" Height="75" Width="240" Click="Login_Click" FontSize="16"/> <TextBlock x:Name="Result" HorizontalAlignment="Left" Margin="355,398,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Height="153" Width="560"/> <PasswordBox x:Name="PfxPassword" HorizontalAlignment="Left" Margin="483,271,0,0" VerticalAlignment="Top" Width="229"/> <TextBlock HorizontalAlignment="Left" Margin="355,271,0,0" TextWrapping="Wrap" Text="PFX password" VerticalAlignment="Top" FontSize="18" Height="32" Width="123"/> <Button x:Name="Browse" Content="Browse for PFX file" HorizontalAlignment="Left" Margin="352,189,0,0" VerticalAlignment="Top" Click="Browse_Click" Width="499" Height="68" FontSize="16"/> <TextBlock HorizontalAlignment="Left" Margin="717,271,0,0" TextWrapping="Wrap" Text="(Optional)" VerticalAlignment="Top" Height="32" Width="83" FontSize="16"/>
Simpan file MainPage.xaml.
Dalam file MainPage.xaml.cs, tambahkan pernyataan penggunaan berikut.
using Windows.Web.Http; using System.Text; using Windows.Security.Cryptography.Certificates; using Windows.Storage.Pickers; using Windows.Storage; using Windows.Storage.Streams;
Dalam file MainPage.xaml.cs, tambahkan variabel berikut ke kelas MainPage . Mereka menentukan alamat untuk metode "Masuk" yang aman dari layanan web "FirstContosoBank" Anda, dan variabel global yang menyimpan sertifikat PFX untuk diimpor ke penyimpanan sertifikat. <Perbarui nama> server ke nama server yang sepenuhnya memenuhi syarat untuk server Microsoft Internet Information Server (IIS) Anda.
private Uri requestUri = new Uri("https://<server-name>/FirstContosoBank/Service1.asmx?op=Login"); private string pfxCert = null;
Dalam file MainPage.xaml.cs, tambahkan penanganan klik berikut untuk tombol masuk dan metode untuk mengakses layanan web aman.
private void Login_Click(object sender, RoutedEventArgs e) { MakeHttpsCall(); } private async void MakeHttpsCall() { StringBuilder result = new StringBuilder("Login "); HttpResponseMessage response; try { Windows.Web.Http.HttpClient httpClient = new Windows.Web.Http.HttpClient(); response = await httpClient.GetAsync(requestUri); if (response.StatusCode == HttpStatusCode.Ok) { result.Append("successful"); } else { result = result.Append("failed with "); result = result.Append(response.StatusCode); } } catch (Exception ex) { result = result.Append("failed with "); result = result.Append(ex.Message); } Result.Text = result.ToString(); }
Dalam file MainPage.xaml.cs, tambahkan penghandel klik berikut untuk tombol telusuri file PFX dan tombol untuk mengimpor file PFX yang dipilih ke penyimpanan sertifikat.
private async void Import_Click(object sender, RoutedEventArgs e) { try { Result.Text = "Importing selected certificate into user certificate store...."; await CertificateEnrollmentManager.UserCertificateEnrollmentManager.ImportPfxDataAsync( pfxCert, PfxPassword.Password, ExportOption.Exportable, KeyProtectionLevel.NoConsent, InstallOptions.DeleteExpired, "Import Pfx"); Result.Text = "Certificate import succeeded"; } catch (Exception ex) { Result.Text = "Certificate import failed with " + ex.Message; } } private async void Browse_Click(object sender, RoutedEventArgs e) { StringBuilder result = new StringBuilder("Pfx file selection "); FileOpenPicker pfxFilePicker = new FileOpenPicker(); pfxFilePicker.FileTypeFilter.Add(".pfx"); pfxFilePicker.CommitButtonText = "Open"; try { StorageFile pfxFile = await pfxFilePicker.PickSingleFileAsync(); if (pfxFile != null) { IBuffer buffer = await FileIO.ReadBufferAsync(pfxFile); using (DataReader dataReader = DataReader.FromBuffer(buffer)) { byte[] bytes = new byte[buffer.Length]; dataReader.ReadBytes(bytes); pfxCert = System.Convert.ToBase64String(bytes); PfxPassword.Password = string.Empty; result.Append("succeeded"); } } else { result.Append("failed"); } } catch (Exception ex) { result.Append("failed with "); result.Append(ex.Message); ; } Result.Text = result.ToString(); }
Jalankan aplikasi Anda dan masuk ke layanan web aman Anda serta impor file PFX ke penyimpanan sertifikat lokal.
Anda dapat menggunakan langkah-langkah ini untuk membuat beberapa aplikasi yang menggunakan sertifikat pengguna yang sama untuk mengakses layanan web aman yang sama atau berbeda.