Bagikan melalui


Tambah fitur masuk dengan Azure Active Directory B2C ke aplikasi web Spring

Artikel ini memperlihatkan kepada Anda cara membuat aplikasi Java dengan kemampuan masuk dengan menggunakan Spring Initializr dengan Spring Boot Starter untuk ID Microsoft Entra.

Dalam tutorial ini, Anda mempelajari cara:

  • Membuat aplikasi Java menggunakan Spring Initializr
  • Mengonfigurasi Azure Active Directory B2C
  • Mengamankan aplikasi dengan kelas dan anotasi Spring Boot
  • Membangun dan menguji aplikasi Java Anda

microsoft Entra ID adalah solusi identitas perusahaan skala cloud Microsoft. Azure Active Directory B2C melengkapi kumpulan fitur Microsoft Entra ID, memungkinkan Anda mengelola akses pelanggan, konsumen, dan warga ke aplikasi bisnis-ke-konsumen (B2C) Anda.

Prasyarat

  • Langganan Azure. Jika Anda belum memilikinya, buat akun gratis sebelum memulai.
  • Java Development Kit (JDK) yang didukung. Untuk informasi selengkapnya tentang JDK yang tersedia untuk digunakan saat mengembangkan di Azure, lihat dukungan Java di Azure dan Azure Stack.
  • Apache Maven, versi 3.0 atau yang lebih tinggi.

Penting

Spring Boot versi 2.5 atau yang lebih tinggi diperlukan untuk menyelesaikan langkah-langkah dalam artikel ini.

Membuat aplikasi menggunakan Spring Initializr

  1. Telusuri ke https://start.spring.io/.

  2. Isi nilai sesuai dengan panduan ini. Label dan tata letak mungkin berbeda dari gambar yang ditunjukkan di sini.

    • Di bawah Project, pilih Maven Project.
    • Di bawah Bahasa, pilih Java.
    • Di bagian Spring Boot, pilih 2.7.11.
    • Di bawahGrup , Artefak dan Nama masukkan nilai yang sama, menggunakan string deskriptif pendek. UI dapat secara otomatis mengisi beberapa bidang ini saat Anda mengetik.
    • Di Panel Dependensi , pilih Tambahkan Dependensi. Gunakan UI untuk menambahkan dependensi pada Spring Web dan Spring Security.

    Nota

    Spring Security 5.5.1, 5.4.7, 5.3.10 dan 5.2.11 telah dirilis untuk mengatasi laporan CVE berikut CVE-2021-22119: Serangan Penolakan Layanan dengan spring-security-oauth2-client. Jika Anda menggunakan versi yang lebih lama, silakan tingkatkan.

  3. Pilih Hasilkan Proyek, lalu unduh proyek ke folder di komputer lokal Anda. Pindahkan file yang diunduh ke direktori bernama sesuai proyek Anda dan buka zip file. Tata letak file akan terlihat seperti berikut ini, dengan nilai yang Anda masukkan untuk Grup menggantikan .

    .
    ├── HELP.md
    ├── mvnw
    ├── mvnw.cmd
    ├── pom.xml
    └── src
        ├── main
        │   ├── java
        │   │   └── yourProject
        │   │       └── yourProject
        │   │           └── YourProjectApplication.java
        │   └── resources
        │       ├── application.properties
        │       ├── static
        │       └── templates
        └── test
            └── java
                └── yourProject
                    └── yourProject
                        └── YourProjectApplicationTests.java
    

Membuat dan menginisialisasi instans Microsoft Entra

Membuat instans Direktori Aktif

  1. Masuk ke https://portal.azure.com.

  2. Pilih Buat sumber daya. Cari Azure Active Directory B2C.

    Buat instans Azure Active Directory B2C baru menggunakan portal Microsoft Azure.

  3. Pilih Buat.

    entri Marketplace Azure untuk Azure Active Directory B2C.

  4. Pilih Buat Tenant Azure AD B2C baru.

    opsi portal Microsoft Azure untuk membuat Penyewa Azure AD B2C baru.

  5. Untuk nama organisasi dan nama domain awal , berikan nilai yang sesuai, lalu pilih Buat.

    layar Buat Penyewa Azure AD B2C.

  6. Saat pembuatan Direktori Aktif selesai, pilih akun Anda di sudut kanan atas, pilih Beralih direktori, lalu pilih direktori yang dibuat. Anda akan diarahkan ke beranda penyewa baru. Kemudian cari b2c dan pilih Azure AD B2C.

    Temukan layanan Azure AD B2C.

Menambahkan pendaftaran aplikasi untuk aplikasi Spring Boot Anda

  1. Di panel Kelola, pilih pendaftaran aplikasi , lalu pilih Pendaftaran baru.

    Cuplikan layar portal Microsoft Azure yang memperlihatkan layar pendaftaran Aplikasi Azure AD B2C.

  2. Di bidang Nama, masukkan nama aplikasi Anda, kemudian pilih Daftar.

    Azure AD B2C mendaftarkan formulir aplikasi.

  3. Kembali ke panel Pengelolaan, pilih Pendaftaran Aplikasi, lalu pilih nama aplikasi yang Anda buat.

    layar pendaftaran aplikasi dengan nama tampilan yang dipilih.

  4. Pilih Autentikasi, lalu Tambahkan platform, kemudian Web. Atur URI Pengalihan ke http://localhost:8080/login/oauth2/code/, lalu pilih Konfigurasikan.

    Opsi yang dipilih untuk autentikasi, tambahkan platform, web.

    Mengonfigurasi layar Web dengan bidang URI Pengalihan dipilih.

Menambahkan rahasia aplikasi untuk aplikasi Anda

Pilih Sertifikat & rahasia, lalu Rahasia klien baru. Masukkan deskripsi rahasia Anda lalu pilih Tambahkan. Setelah Anda membuat rahasia, pilih ikon salin di samping nilai rahasia untuk menyalin nilai untuk digunakan nanti di artikel ini.

Tambahkan layar rahasia klien.

Layar Sertifikat dan Rahasia dengan tombol salin yang dipilih.

Nota

Apabila Anda meninggalkan bagian Sertifikat rahasia & kemudian kembali, Anda tidak akan dapat melihat nilai rahasia. Dalam hal ini, Anda harus membuat rahasia lain dan menyalinnya untuk digunakan di masa mendatang.

Terkadang, nilai rahasia yang dihasilkan mungkin berisi karakter yang bermasalah untuk dimasukkan dalam file application.yml, seperti garis miring terbalik atau backtick. Dalam hal ini, buang rahasia itu dan hasilkan yang lain.

Menambahkan alur pengguna

  1. Navigasi ke halaman utama penyewa Anda. Di bagian Kebijakan di panel kiri, pilih Alur pengguna, lalu pilih Alur pengguna baru.

  2. Anda sekarang akan meninggalkan tutorial ini, menjalankan tutorial lain, dan kembali ke tutorial ini setelah Selesai. Berikut adalah beberapa hal yang perlu diingat ketika Anda pergi ke tutorial lain.

    • Mulailah dengan langkah yang meminta Anda untuk memilih alur pengguna baru.
    • Ketika tutorial ini mengacu pada webapp1, gunakan nilai yang Anda masukkan untuk Grup sebagai gantinya.
    • Saat Anda memilih klaim untuk dikembalikan dari proses alur, pastikan Nama Tampilan dipilih. Tanpa klaim ini, aplikasi yang dibangun dalam tutorial ini tidak akan berfungsi.
    • Saat Anda diminta untuk menjalankan alur pengguna, URL pengalihan yang Anda tentukan sebelumnya belum aktif. Anda masih dapat menjalankan alur, tetapi pengalihan tidak akan berhasil diselesaikan. Ini diharapkan.
    • Ketika Anda mencapai "Langkah berikutnya", kembali ke tutorial ini.

    Ikuti semua langkah dalam Tutorial : Membuat alur pengguna di Azure Active Directory B2C untuk membuat alur pengguna untuk "pendaftaran dan masuk", "pengeditan profil" dan "reset kata sandi".

    Azure AD B2C mendukung akun lokal serta penyedia identitas sosial. Untuk contoh membuat penyedia identitas GitHub, lihat Menyiapkan pendaftaran dan masuk dengan akun GitHub menggunakan Azure Active Directory B2C.

Mengonfigurasi dan mengkompilasi aplikasi Anda

Setelah membuat instans Azure AD B2C dan beberapa alur pengguna, Anda akan menyambungkan aplikasi Spring ke instans Azure AD B2C.

  1. Dari baris perintah, cd ke dalam direktori di mana Anda meng-unzip file .zip yang Anda unduh dari Spring Initializr.

  2. Navigasikan ke folder induk untuk proyek Anda, dan buka file proyek pom.xml Maven di editor teks.

  3. Tambahkan dependensi untuk keamanan Spring OAuth2 ke pom.xml:

    <dependency>
        <groupId>com.azure.spring</groupId>
        <artifactId>spring-cloud-azure-starter-active-directory-b2c</artifactId>
        <version>See Below</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-thymeleaf</artifactId>
        <version>See Below</version>
    </dependency>
    <dependency>
        <groupId>org.thymeleaf.extras</groupId>
        <artifactId>thymeleaf-extras-springsecurity5</artifactId>
        <version>See Below</version>
    </dependency>
    

    Untuk spring-cloud-azure-starter-active-directory-b2c, gunakan versi terbaru yang tersedia. Anda mungkin dapat menggunakan mvnrepository.com untuk mencari informasi ini.

    Untuk spring-boot-starter-thymeleaf, gunakan versi yang sesuai dengan versi Spring Boot yang Anda pilih di atas, misalnya 2.3.4.RELEASE.

    Untuk thymeleaf-extras-springsecurity5, gunakan versi terbaru yang tersedia. Anda mungkin dapat menggunakan mvnrepository.com untuk mencari informasi ini. Saat penulisan ini, versi terbaru adalah 3.0.4.RELEASE.

  4. Simpan dan tutup file pom.xml.

    • Verifikasi bahwa dependensi Anda sudah benar dengan menjalankan mvn -DskipTests clean install. Jika Anda tidak melihat BUILD SUCCESS, pecahkan masalah dan atasi masalah sebelum melanjutkan.
  5. Navigasikan ke folder src/main/resources di proyek Anda dan buat file application.yml di editor teks.

  6. Tentukan pengaturan untuk pendaftaran aplikasi Anda menggunakan nilai yang Anda buat sebelumnya; misalnya:

    spring:
      cloud:
        azure:
          active-directory:
            b2c:
              enabled: true
              base-uri: https://<your-tenant-initial-domain-name>.b2clogin.com/<your-tenant-initial-domain-name>.onmicrosoft.com/
              credential:
                client-id: <your-application-ID>
                client-secret: '<secret-value>'
              login-flow: sign-up-or-sign-in
              logout-success-url: <your-logout-success-URL>
              user-flows:
                sign-up-or-sign-in: <your-sign-up-or-sign-in-user-flow-name> 
                profile-edit: <your-profile-edit-user-flow-name> 
                password-reset: <your-password-reset-user-flow-name> 
              user-name-attribute-name: <your-user-name-attribute-name> 
    

    Perhatikan bahwa nilai client-secret diapit dalam tanda kutip tunggal. Ini diperlukan karena nilai <secret-value> hampir pasti akan berisi beberapa karakter yang harus berada di dalam tanda kutip tunggal saat ada di dalam YAML.

    Nota

    Pada penulisan ini, daftar lengkap nilai Integrasi Spring B2C Direktori Aktif yang tersedia untuk digunakan dalam application.yml adalah sebagai berikut:

    spring:
      cloud:
        azure:
          active-directory:
            b2c:
              enabled: true
              base-uri:
              credential:
                client-id:
                client-secret:
              login-flow:  
              logout-success-url:
              user-flows:
                sign-up-or-sign-in:
                profile-edit: # optional
                password-reset: # optional
              user-name-attribute-name:
    

    File application.yml tersedia di GitHub dalam sampel spring-cloud-azure-starter-active-directory-b2c: aad-b2c-web-application.

  7. Simpan dan tutup file application.yml.

  8. Buat folder bernama controller di src/main/java/<yourGroupId>/<yourGroupId>, mengganti <yourGroupId> dengan nilai yang Anda masukkan untuk grup .

  9. Buat file Java baru bernama WebController.java di folder pengontrol dan buka di editor teks.

  10. Masukkan kode berikut, mengubah yourGroupId dengan tepat, lalu simpan dan tutup file:

    package yourGroupId.yourGroupId.controller;
    
    import org.springframework.security.oauth2.client.authentication.OAuth2AuthenticationToken;
    import org.springframework.security.oauth2.core.user.OAuth2User;
    import org.springframework.stereotype.Controller;
    import org.springframework.ui.Model;
    import org.springframework.web.bind.annotation.GetMapping;
    
    @Controller
    public class WebController {
    
        private void initializeModel(Model model, OAuth2AuthenticationToken token) {
            if (token != null) {
                final OAuth2User user = token.getPrincipal();
    
                model.addAttribute("grant_type", user.getAuthorities());
                model.addAllAttributes(user.getAttributes());
            }
        }
    
        @GetMapping(value = "/")
        public String index(Model model, OAuth2AuthenticationToken token) {
            initializeModel(model, token);
    
            return "home";
        }
    
        @GetMapping(value = "/greeting")
        public String greeting(Model model, OAuth2AuthenticationToken token) {
            initializeModel(model, token);
    
            return "greeting";
        }
    
        @GetMapping(value = "/home")
        public String home(Model model, OAuth2AuthenticationToken token) {
            initializeModel(model, token);
    
            return "home";
        }
    }
    

    Karena setiap metode dalam pengontrol memanggil initializeModel(), dan metode tersebut memanggil model.addAllAttributes(user.getAttributes());, halaman HTML apa pun di src/main/resources/templates dapat mengakses salah satu atribut tersebut, seperti ${name}, ${grant_type}, atau ${auth_time}. Nilai yang dikembalikan dari user.getAttributes() sebenarnya adalah klaim id_token untuk autentikasi. Daftar lengkap klaim yang tersedia tercantum dalam token ID platform identitas Microsoft.

  11. Buat folder bernama keamanan di src/main/java/<yourGroupId>/<yourGroupId>, mengganti yourGroupId dengan nilai yang Anda masukkan untuk Grup .

  12. Buat file Java baru bernama WebSecurityConfiguration.java di folder keamanan dan buka di editor teks.

  13. Masukkan kode berikut, mengubah yourGroupId dengan tepat, lalu simpan dan tutup file:

    package yourGroupId.yourGroupId.security;
    
    import com.azure.spring.cloud.autoconfigure.aadb2c.AadB2cOidcLoginConfigurer;
    import org.springframework.security.config.annotation.web.builders.HttpSecurity;
    import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
    import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
    
    @EnableWebSecurity
    public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter {
    
        private final AadB2cOidcLoginConfigurer configurer;
    
        public WebSecurityConfiguration(AadB2cOidcLoginConfigurer configurer) {
            this.configurer = configurer;
        }
    
        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http
                    .authorizeRequests()
                    .anyRequest()
                    .authenticated()
                    .and()
                    .apply(configurer)
            ;
        }
    }
    
  14. Salin file home.html dari sampel spring-cloud-azure-starter-active-directory-b2c: aad-b2c-web-application ke src/main/resources/templates, dan ganti ${your-profile-edit-user-flow} dan ${your-password-reset-user-flow} dengan nama alur pengguna yang Anda buat sebelumnya.

Membuat dan menguji aplikasi Anda

  1. Buka perintah dan ubah direktori ke folder tempat file pom.xml aplikasi Anda berada.

  2. Bangun aplikasi Spring Boot Anda dengan Maven dan jalankan; misalnya:

    Nota

    Sangat penting bahwa waktu sesuai jam sistem di mana aplikasi spring boot lokal berjalan itu akurat. Sangat sedikit toleransi kemiringan jam saat menggunakan OAuth 2.0. Ketidakakuratan selama tiga menit dapat menyebabkan masuk gagal dengan kesalahan yang mirip dengan [invalid_id_token] An error occurred while attempting to decode the Jwt: Jwt used before 2020-05-19T18:52:10Z. Pada saat penulisan ini, time.gov memiliki indikator seberapa jauh jam Anda dari waktu aktual. Aplikasi berhasil dijalankan dengan condong +0,019 detik.

    mvn -DskipTests clean package
    mvn -DskipTests spring-boot:run
    
  3. Setelah aplikasi Anda dibangun dan dimulai oleh Maven, buka http://localhost:8080/ di browser web; Anda harus diarahkan ke halaman masuk.

    halaman masuk aplikasi Web.

  4. Pilih tautan dengan teks yang berkaitan dengan masuk ke akun. Anda harus dialihkan Azure AD B2C untuk memulai proses autentikasi.

  5. Setelah berhasil masuk, Anda akan melihat sampel home page dari browser,

    aplikasi Web berhasil masuk.

Pemecahan masalah

Bagian berikut ini menjelaskan cara mengatasi beberapa masalah yang mungkin Anda temui.

Nama atribut yang hilang dalam atribut

Saat menjalankan sampel, Anda mungkin mendapatkan pengecualian dengan pesan Missing attribute 'name' in attributes. Log untuk pengecualian ini akan terlihat mirip dengan output berikut:

java.lang.IllegalArgumentException: Missing attribute 'name' in attributes
at org.springframework.security.oauth2.core.user.DefaultOAuth2User.<init>(DefaultOAuth2User.java:67) ~[spring-security-oauth2-core-5.3.6.RELEASE.jar:5.3.6.RELEASE]
at org.springframework.security.oauth2.core.oidc.user.DefaultOidcUser.<init>(DefaultOidcUser.java:89) ~[spring-security-oauth2-core-5.3.6.RELEASE.jar:5.3.6.RELEASE]
at org.springframework.security.oauth2.client.oidc.userinfo.OidcUserService.loadUser(OidcUserService.java:144) ~[spring-security-oauth2-client-5.3.6.RELEASE.jar:5.3.6.RELEASE]
at org.springframework.security.oauth2.client.oidc.userinfo.OidcUserService.loadUser(OidcUserService.java:63) ~[spring-security-oauth2-client-5.3.6.RELEASE.jar:5.3.6.RELEASE]

Jika Anda mendapatkan kesalahan ini, periksa kembali alur kerja pengguna yang Anda buat di Tutorial : Membuat alur pengguna di Azure Active Directory B2C. Saat membuat alur kerja pengguna, untuk atribut dan klaim pengguna , pastikan untuk memilih atribut dan klaim untuk Nama Tampilan. Selain itu, pastikan untuk mengonfigurasi user-name-attribute-name dengan benar dalam file application.yml.

Masuk dengan perulangan ke titik akhir B2C

Masalah ini kemungkinan besar disebabkan oleh cookie yang tercemari untuk localhost. Bersihkan kuki untuk localhost dan coba lagi.

Ringkasan

Dalam tutorial ini, Anda membuat aplikasi web Java baru menggunakan starter Azure Active Directory B2C, mengonfigurasi penyewa Azure AD B2C baru, dan mendaftarkan aplikasi baru di dalamnya, lalu mengonfigurasi aplikasi Anda untuk menggunakan anotasi dan kelas Spring untuk melindungi aplikasi web.

Membersihkan sumber daya

Jika tidak lagi diperlukan, gunakan portal Microsoft Azure untuk menghapus sumber daya yang dibuat dalam artikel ini untuk menghindari biaya yang tidak terduga.

Langkah berikutnya

Untuk mempelajari selengkapnya tentang Spring dan Azure, lanjutkan ke pusat dokumentasi Spring on Azure.