Aracılığıyla paylaş


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 şunların 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önetmenize olanak tanır.

Önkoşullar

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

Ö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 gidin.

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

    • Projesialtında, Maven Projesiseçeneğini seçin.
    • Dilolarak Javaseçin.
    • Spring Bootaltında, 2.7.11öğesini seçin.
    • Grupaltında, Artefakt ve Adı için 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 Securitybağımlılıkları 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-22119 cve-security-oauth2-clientile Hizmet Reddi saldırısı. Eski sürümü kullanıyorsanız lütfen yükseltin.

  3. Proje Oluşturöğesini seçin ve ardından projeyi yerel bilgisayarınızdaki bir konuma 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 yourProject iç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.comoturum açın.

  2. Kaynakoluştur'u seçin. Azure Active Directory B2Ciçin arama yapın.

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

  3. oluştur'useçin.

    Azure Active Directory B2C için Azure Marketplace girdisi .

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

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

  5. Kuruluş adı ve Başlangıç etki alanı adıiçin uygun değerleri girin, ardından Oluşturöğesini seçin.

    Azure AD B2C Kiracı Oluştur ekranını .

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

    Azure AD B2C hizmetini bulun.

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

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

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

  2. Ad alanına uygulamanızın adını girin, ardından Kaydetseçeneğini seçin.

    Azure AD B2C'yi bir uygulama formu kaydedin.

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

    Uygulama kayıtları ekranında görünen ad seçili durumda.

  4. Kimlik Doğrulamasıseçin, ardından Platform ekle , sonra Web . Yeniden Yönlendirme URI'lerinihttp://localhost:8080/login/oauth2/code/olarak ayarlayın ve Yapılandır'ı seçin.

    Kimlik doğrulaması için seçenekleri seçin ve bir web platformu ekleyin.

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

Uygulamanız için uygulama sırlarını ekleyin

Sertifikalar & gizli dizileri'ni seçin ve ardından yeni istemci gizli dizileri. Gizli açıklamanızı girin ve Ekleöğesini seçin. Gizli anahtarı oluşturduktan sonra, gizli anahtar değerinin yanındaki kopyala simgesini seçerek değeri ilerleyen kısımlarda kullanmak üzere kopyalayın.

İstemci gizli anahtarı ekranı ekle.

Sertifikalar ve gizli bilgiler ekranı, kopyala düğmesinin seçili olduğu. .

Not

Sertifikaları & gizli bilgiler bölümünden ayrılır ve geri dönerseniz, gizli bilgi değerini göremezsiniz. Bu durumda, başka bir gizli oluşturmanız ve gelecekte kullanmak üzere kopyalamanız gerekir.

Bazen, oluşturulan gizli dizi değeri ters eğik çizgi veya ters tırnak işareti gibi application.yml dosyasına eklenmesiyle ilgili sorunlu karakterler içerebilir. Bu durumda, o sırrı atıp başka bir sır oluşturun.

Kullanıcı akışı ekleme

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

  2. Şimdi bu eğitimden ayrılacak, başka bir eğitimi uygulayacaksınız ve işiniz bittiğinde bu eğitime geri döneceksiniz. Diğer öğreticiye gittiğinizde aklınızda bulundurmanız gereken bazı şeyler şunlardır.

    • Yeni Kullanıcı Akışıseçmenizi isteyen adımla başlayın.
    • Bu öğretici webapp1'a atıfta bulunuyorsa, bunun yerine Grup için girdiğiniz değeri kullanın.
    • Akışlardan döndürülecek talepleri seçerken Görünen Ad seçildiğinden emin olun. Bu iddia olmadan, bu öğreticide oluşturulan uygulama çalışmayacak.
    • 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.

    Öğreticisi: "Kaydolma ve oturum açma", "profil düzenleme" ve "parola sıfırlama" için kullanıcı akışları oluşturmak üzere Azure Active Directory B2C 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 B2Ckullanarak 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ında, Spring Initializr'dan indirdiğiniz .zip dosyasının sıkıştırmasını açtığınız dizine cd komutunu kullanarak geçin.

  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 gerekli bağımlılıkları pom.xml'ye 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>
    

    spring-cloud-azure-starter-active-directory-b2ciçin, 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ğin 2.3.4.RELEASE.

    thymeleaf-extras-springsecurity5için, kullanılabilir en son sürümü kullanın. Bunu aramak için mvnrepository.com kullanabilirsiniz. Bu yazının yazıldığı tarihte, en son sürüm 3.0.4.RELEASE.

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

    • mvn -DskipTests clean installkomutunu çalıştırarak bağımlılıklarınızın doğru olduğunu doğrulayın. BUILD SUCCESSgörmüyorsanız devam 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ın ayarlarını belirtin; mesela:

    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> 
    

    client-secret değerinin tek tırnak içine alındığına dikkat edin. <secret-value> değeri 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'da kullanılabilen Active Directory B2C Spring Tümleştirme 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ı spring-cloud-azure-starter-active-directory-b2c örneğinde kullanılabilir: GitHub'da aad-b2c-web-application.

  7. application.yml dosyasını kaydedin ve kapatın.

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

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

  10. Aşağıdaki kodu girin, yourGroupId uygun şekilde değiştirin ve 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 çağırdığından ve bu yöntem çağırdığından, src/main/resources/templates içindeki tüm HTML sayfaları , veya gibi bu özniteliklerden herhangi birine erişebilir. user.getAttributes()'dan dönen 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/ içinde güvenlik adlı bir klasör oluşturun<GroupId>/<GroupId>yourGroupId yerine Groupiçin girdiğiniz değeri yazın.

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

  13. Aşağıdaki kodu girin, yourGroupId uygun şekilde değiştirin ve 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-applicationsrc/main/resources/templatesve ${your-profile-edit-user-flow} ve ${your-password-reset-user-flow} daha önce oluşturduğunuz kullanıcı akışlarının adlarıyla değiştirin.

Uygulamanızı derleme ve test etme

  1. Bir komut istemi açın ve dizini uygulamanızın pom.xml dosyasının bulunduğu klasörle değiştirin.

  2. Spring Boot uygulamanızı Maven ile derleyin ve çalıştırın; mesela:

    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 kaymasına çok az tolerans vardır. Üç dakikalık yanlışlık bile oturum açma işleminin [invalid_id_token] An error occurred while attempting to decode the Jwt: Jwt used before 2020-05-19T18:52:10Zbenzer bir 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 tarafından derlenip başlatıldıktan sonra http://localhost:8080/ bir web tarayıcısında açın; oturum açma sayfasına yönlendirilmelidir.

    Web uygulaması oturum açma sayfasını .

  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 örnek home page görmeniz gerekir.

    Web uygulamasının 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 Missing attribute 'name' in attributesmesajıyla bir özel durum alabilirsiniz. Bu istisnanın kaydı 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, Öğreticisi: Azure Active Directory B2C'de kullanıcı akışları oluşturmaiçinde oluşturduğunuz kullanıcı iş akışını bir kez daha denetleyin. Kullanıcı iş akışını oluştururken, Kullanıcı öznitelikleri ve iddialarıiçin ve Görünen Adiçin öznitelikleri seçtiğinizden emin olun. Ayrıca, user-name-attribute-name dosyasındaki düzgün yapılandırıldığından emin olun.

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

Bu sorun büyük olasılıkla localhostiçin kirli çerezlerden kaynaklanır. localhost için tanımlama bilgilerini 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 gerekmediğinde, beklenmeyen ücretlerden kaçınmak için bu makalede oluşturulan kaynakları silmek için Azure portalı kullanın.

Sonraki adımlar

Spring ve Azure hakkında daha fazla bilgi edinmek için Azure'da Spring belge merkezine geçin.