Spring web uygulamasına Azure Active Directory B2C ile oturum açma ekleme

Bu makalede, Microsoft Entra Id için Spring Boot Starter ile Spring Initializr kullanarak oturum açma özelliğine sahip bir Java uygulamasının nasıl oluşturulacağı gösterilmektedir.

Bu öğreticide aşağıdakilerin nasıl yapılacağını öğreneceksiniz:

  • Spring Initializr kullanarak Java uygulaması oluşturma
  • Azure Active Directory B2C'yi yapılandırma
  • Spring Boot sınıfları ve ek açıklamaları ile uygulamanın güvenliğini sağlama
  • Java uygulamanızı derleme ve test etme

Microsoft Entra ID , Microsoft'un bulut ölçekli kurumsal kimlik çözümüdür. Azure Active Directory B2C , Microsoft Entra Id özellik kümesini tamamlayarak işletmeden müşteriye (B2C) uygulamalarınıza müşteri, tüketici ve vatandaş erişimini yönetmenizi sağlar.

Önkoşullar

  • Azure aboneliği. Henüz bir hesabınız yoksa başlamadan önce ücretsiz bir hesap oluşturun.
  • Desteklenen bir Java Development Kit (JDK). Azure'da geliştirme yaparken kullanılabilecek JDK'ler hakkında daha fazla bilgi için bkz . Azure ve Azure Stack'te Java desteği.
  • Apache Maven, sürüm 3.0 veya üzeri.

Önemli

Bu makaledeki adımları tamamlamak için Spring Boot sürüm 2.5 veya üzeri gereklidir.

Spring Initializr kullanarak uygulama oluşturma

  1. https://start.spring.io/ adresine göz atın.

  2. Değerleri bu kılavuza göre doldurun. Etiketler ve düzen burada gösterilen görüntüden farklı olabilir.

    • Proje'nin altında Maven Projesi'ne tıklayın.
    • Dil'in altında Java'yı seçin.
    • Spring Boot'un altında 2.7.11'i seçin.
    • Grup, Yapıt ve Ad altında, kısa bir açıklayıcı dize kullanarak aynı değeri girin. Siz yazarken kullanıcı arabirimi bu alanlardan bazılarını otomatik olarak doldurabilir.
    • Bağımlılıklar bölmesinde Bağımlılık Ekle'yi seçin. Spring Web ve Spring Security'ye bağımlılık eklemek için kullanıcı arabirimini kullanın.

    Not

    Spring Security 5.5.1, 5.4.7, 5.3.10 ve 5.2.11, CVE-2021-22119 cve-2021 : spring-security-oauth2-client ile Hizmet Reddi saldırısına yönelik olarak kullanıma sunuldu. Eski sürümü kullanıyorsanız lütfen yükseltin.

  3. Proje Oluştur'a tıklayın, ardından projeyi yerel bilgisayarınızdaki bir yola indirin. İndirilen dosyayı projenizin adını taşıyan bir dizine taşıyın ve dosyanın sıkıştırmasını açın. Dosya düzeni, yerine Group yourProjectiçin girdiğiniz değerle aşağıdakine benzer olmalıdır.

    .
    ├── 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
    

Microsoft Entra örneği oluşturma ve başlatma

Active Directory örneğini oluşturma

  1. https://portal.azure.com adresinden oturum açın.

  2. Kaynak oluştur’u seçin. Azure Active Directory B2C’yi aratın.

    Azure portalını kullanarak yeni Azure Active Directory B2C örneği oluşturun.

  3. Oluştur'u belirleyin.

    Azure Active Directory B2C için Azure Market girdisi.

  4. Yeni bir Azure AD B2C Kiracısı oluştur'u seçin.

    Yeni Azure AD B2C Kiracısı oluşturmak için Azure portalı seçeneği.

  5. Kuruluş adı ve İlk etki alanı adı için uygun değerleri sağlayın ve Oluştur'u seçin.

    Azure AD B2C Kiracı Oluştur ekranı.

  6. Active Directory oluşturma işlemi tamamlandığında sağ üst köşedeki hesabınızı seçin, Dizini değiştir'i ve ardından oluşturulan dizini seçin. Yeni kiracı giriş sayfasına yönlendirilirsiniz. Ardından Azure AD B2C'yi arayın b2c ve seçin.

    Azure AD B2C hizmetini bulun.

Spring Boot uygulamanız için uygulama kaydı ekleme

  1. Yönet bölmesinde Uygulama kayıtları ve ardından Yeni kayıt'ı seçin.

    Azure AD B2C Uygulama kayıtları ekranını gösteren Azure portalının ekran görüntüsü.

  2. Ad alanına uygulamanızın adını girin ve Kaydet'i seçin.

    Azure AD B2C bir uygulama formu kaydeder.

  3. Yönet bölmesine dönüp Uygulama kayıtları'ı ve ardından oluşturduğunuz uygulama adını seçin.

    Görünen adın seçili olduğu Uygulama kayıtları ekranı.

  4. Kimlik Doğrulaması'nın ardından Platform ekle'yi ve ardından Web'i seçin. Yeniden Yönlendirme URI'lerini olarak http://localhost:8080/login/oauth2/code/ayarlayın ve yapılandır'ı seçin.

    Kimlik doğrulaması, platform ekleme, web için seçilen seçenekler.

    Yeniden Yönlendirme URI'leri alanı seçili olarak Web ekranını yapılandırın.

Uygulamanız için uygulama gizli dizileri ekleme

Sertifikalar ve gizli diziler'i ve ardından Yeni istemci gizli dizileri'ni seçin. Gizli dizi açıklamanızı girin ve Ekle'yi seçin. Gizli diziyi oluşturduktan sonra, gizli dizi değerinin yanındaki kopyala simgesini seçerek değeri bu makalenin devamında kullanmak üzere kopyalayın.

İstemci gizli dizisi ekranı ekleyin.

Kopyala düğmesinin seçili olduğu sertifikalar ve gizli diziler ekranı.

Not

Sertifikalar ve gizli diziler bölümünden ayrılır ve geri dönerseniz gizli dizi değerini göremezsiniz. Bu durumda, başka bir gizli dizi oluşturmanız ve gelecekte kullanmak üzere kopyalamanız gerekir. Bazen, oluşturulan gizli dizi değeri ters eğik çizgi veya ters eğik çizgi gibi application.yml dosyasına eklenmesiyle ilgili sorunlu karakterler içerebilir. Bu durumda, bu gizli diziyi atıp başka bir gizli dizi oluşturun.

Kullanıcı akışı ekleme

  1. Kiracı ana sayfanıza gidin. Sol bölmenin İlkeler bölümünde Kullanıcı akışları'nı ve ardından Yeni kullanıcı akışı'nı seçin.

  2. Şimdi bu öğreticiden ayrılacak, başka bir öğretici yürütecek ve işiniz bittiğinde bu öğreticiye geri döneceksiniz. Diğer öğreticiye gittiğinizde aklınızda bulundurmanız gereken bazı şeyler şunlardır.

    • Yeni Kullanıcı akışı'nı seçmenizi isteyen adımla başlayın.
    • Bu öğretici öğesine webapp1başvurduğunda, bunun yerine Grup için girdiğiniz değeri kullanın.
    • Akışlardan döndürülecek talepleri seçerken Görünen Ad'ın seçili olduğundan emin olun. Bu talep olmadan, bu öğreticide oluşturulan uygulama çalışmaz.
    • Kullanıcı akışlarını çalıştırmanız istendiğinde, daha önce belirttiğiniz yeniden yönlendirme URL'si henüz etkin değildir. Yine de akışları çalıştırabilirsiniz, ancak yeniden yönlendirme başarıyla tamamlanmaz. Bu beklenen bir durumdur.
    • "Sonraki adımlar"a ulaştığınızda bu öğreticiye geri dönün.

    "Kaydolma ve oturum açma", "profil düzenleme" ve "parola sıfırlama" için kullanıcı akışları oluşturmak için Öğretici: Azure Active Directory B2C'de kullanıcı akışları oluşturma başlığı altındaki tüm adımları izleyin.

    Azure AD B2C hem yerel hesapları hem de sosyal kimlik sağlayıcılarını destekler. GitHub kimlik sağlayıcısı oluşturma örneği için bkz . Azure Active Directory B2C kullanarak GitHub hesabıyla kaydolma ve oturum açma ayarlama.

Uygulamanızı yapılandırma ve derleme

Azure AD B2C örneğini ve bazı kullanıcı akışlarını oluşturduğunuza göre Spring uygulamanızı Azure AD B2C örneğine bağlayacaksınız.

  1. Komut satırından, Cd'den Spring Initializr'dan indirdiğiniz .zip dosyasının sıkıştırmasını açtığınız dizine.

  2. Projenizin üst klasörüne gidin ve pom.xml Maven proje dosyasını bir metin düzenleyicisinde açın.

  3. Spring OAuth2 güvenliği için bağımlılıkları pom.xml ekleyin:

    <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>
    

    için spring-cloud-azure-starter-active-directory-b2c, kullanılabilir en son sürümü kullanın. Bunu aramak için mvnrepository.com kullanabilirsiniz.

    spring-boot-starter-thymeleafiçin yukarıda seçtiğiniz Spring Boot sürümüne karşılık gelen sürümü kullanın, örneğin2.3.4.RELEASE.

    için thymeleaf-extras-springsecurity5, kullanılabilir en son sürümü kullanın. Bunu aramak için mvnrepository.com kullanabilirsiniz. Bu yazıdan itibaren en son sürüm şeklindedir 3.0.4.RELEASE.

  4. Pom.xml dosyasını kaydedin ve kapatın.

    • komutunu çalıştırarak mvn -DskipTests clean installbağımlılıklarınızın doğru olduğunu doğrulayın. seçeneğini görmüyorsanız BUILD SUCCESSdevam etmeden önce sorunu giderin ve çözün.
  5. Projenizdeki src/main/resources klasörüne gidin ve bir metin düzenleyicisinde application.yml dosyası oluşturun.

  6. Daha önce oluşturduğunuz değerleri kullanarak uygulama kaydınız için ayarları belirtin; örneğin:

    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> 
    

    Değerin client-secret tek tırnak içine alındığına dikkat edin. değerinin <secret-value> YAML'de mevcut olduğunda tek tırnak içinde olmasını gerektiren bazı karakterler içermesi nedeniyle bu gereklidir.

    Not

    Bu yazıdan itibaren, application.yml'de kullanılabilen Active Directory B2C Spring Integration değerlerinin tam listesi aşağıdaki gibidir:

    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:
    

    application.yml dosyası, GitHub'da spring-cloud-azure-starter-active-directory-b2c örneğinde kullanılabilir: aad-b2c-web-application.

  7. application.yml dosyasını kaydedip kapatın.

  8. src/main/java/yourGroupId/yourGroupId<>> içinde controller adlı bir klasör oluşturun ve yerine <yourGroupId> Group için girdiğiniz değeri yazın.<

  9. Controller klasöründe WebController.java adlı yeni bir Java dosyası oluşturun ve bir metin düzenleyicide açın.

  10. Aşağıdaki kodu girin, uygun şekilde değiştirin yourGroupId , ardından dosyayı kaydedip kapatın:

    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";
        }
    }
    

    Denetleyicideki her yöntem öğesini çağırdığı initializeModel()ve bu yöntemin çağırdığı model.addAllAttributes(user.getAttributes());için, src/main/resources/templates içindeki tüm HTML sayfaları , ${grant_type}veya ${auth_time}gibi ${name}bu özniteliklerden herhangi birine erişebilir. 'den user.getAttributes() döndürülen değerler aslında kimlik doğrulaması için ' id_token in talepleridir. Kullanılabilir taleplerin tam listesi Microsoft kimlik platformu kimlik belirteçlerinde listelenir.

  11. src/main/java/yourGroupId/yourGroupId<>> içinde security adlı bir klasör oluşturun ve yerine yourGroupId Group için girdiğiniz değeri yazın.<

  12. Security klasöründe WebSecurityConfiguration.java adlı yeni bir Java dosyası oluşturun ve bir metin düzenleyicide açın.

  13. Aşağıdaki kodu girin, uygun şekilde değiştirin yourGroupId , ardından dosyayı kaydedip kapatın:

    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. home.html dosyasını spring-cloud-azure-starter-active-directory-b2c örneğinden kopyalayın: aad-b2c-web-application'dan src/main/resources/templates'a ve öğesini daha önce oluşturduğunuz kullanıcı akışlarının adlarıyla değiştirin ${your-password-reset-user-flow} ${your-profile-edit-user-flow}.

Uygulamanızı derleme ve test etme

  1. Komut istemini açın ve dizini değiştirip uygulamanızın pom.xml dosyasının bulunduğu klasöre geçin.

  2. Spring Boot uygulamanızı Maven’le oluşturun ve çalıştırın; örneğin:

    Not

    Yerel spring boot uygulamasının çalıştığı sistem saatine göre saatin doğru olması son derece önemlidir. OAuth 2.0 kullanılırken saat dengesizliği çok az tolerans gösterir. Üç dakikalık yanlışlık bile, oturum açma işleminin benzer [invalid_id_token] An error occurred while attempting to decode the Jwt: Jwt used before 2020-05-19T18:52:10Zbir hatayla başarısız olmasına neden olabilir. Bu yazıdan itibaren time.gov, saatinizin gerçek saatten ne kadar uzak olduğunu gösteren bir göstergeye sahiptir. Uygulama +0,019 saniyelik bir dengesizlikle başarıyla çalıştırıldı.

    mvn -DskipTests clean package
    mvn -DskipTests spring-boot:run
    
  3. Uygulamanız Maven ile derlendikten ve başlatıldıktan sonra bir web tarayıcısında http://localhost:8080/ adresini açın; oturum açma sayfasına yönlendirilmeniz gerekir.

    Web uygulaması oturum açma sayfası.

  4. Oturum açmayla ilgili metin içeren bağlantıyı seçin. Kimlik doğrulama işlemini başlatmak için Azure AD B2C'ye yönlendirilmelisiniz.

  5. Başarıyla oturum açtıktan sonra tarayıcıdan örneği home page görmeniz gerekir.

    Web uygulaması başarılı oturum açma.

Sorun giderme

Aşağıdaki bölümlerde karşılaşabileceğiniz bazı sorunların nasıl çözülebileceği açıklanmaktadır.

Özniteliklerde öznitelik adı eksik

Örneği çalıştırırken iletisiyle Missing attribute 'name' in attributesbir özel durum alabilirsiniz. Bu özel durumun günlüğü aşağıdaki çıkışa benzer olacaktır:

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]

Bu hatayı alırsanız Öğretici: Azure Active Directory B2C'de kullanıcı akışları oluşturma bölümünde oluşturduğunuz kullanıcı iş akışını bir kez daha denetleyin. Kullanıcı iş akışını oluştururken, Kullanıcı öznitelikleri ve talepleri için Görünen Ad için öznitelikleri ve talepleri seçtiğinizden emin olun. Ayrıca, application.yml dosyasında düzgün yapılandırıldığından user-name-attribute-name emin olun.

B2C uç noktasına döngülerle oturum açma

Bu sorun büyük olasılıkla için localhostkirli çerezlerden kaynaklanır. için tanımlama bilgilerini localhost temizleyin ve yeniden deneyin.

Özet

Bu öğreticide, Azure Active Directory B2C başlatıcısını kullanarak yeni bir Java web uygulaması oluşturdunuz, yeni bir Azure AD B2C kiracısı yapılandırıp yeni bir uygulama kaydettiniz ve ardından uygulamanızı Web uygulamasını korumak için Spring ek açıklamalarını ve sınıflarını kullanacak şekilde yapılandırdık.

Kaynakları temizleme

Artık gerekli olmadığında, beklenmeyen ücretlerden kaçınmak için Azure portalını kullanarak bu makalede oluşturulmuş olan kaynakları silin.

Sonraki adımlar

Spring ve Azure hakkında daha fazlasını öğrenmek için Azure’da Spring belge merkezinde çalışmaya devam edin.