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
https://start.spring.io/ adresine göz atın.
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.
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
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
https://portal.azure.com adresinden oturum açın.
Kaynak oluştur’u seçin. Azure Active Directory B2C’yi aratın.
Oluştur'u belirleyin.
Yeni bir Azure AD B2C Kiracısı oluştur'u seçin.
Kuruluş adı ve İlk etki alanı adı için uygun değerleri sağlayın ve Oluştur'u seçin.
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.
Spring Boot uygulamanız için uygulama kaydı ekleme
Yönet bölmesinde Uygulama kayıtları ve ardından Yeni kayıt'ı seçin.
Ad alanına uygulamanızın adını girin ve Kaydet'i seçin.
Yönet bölmesine dönüp Uygulama kayıtları'ı ve ardından oluşturduğunuz uygulama adını seçin.
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.
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.
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
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.
Ş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
webapp1
baş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.
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.
Projenizin üst klasörüne gidin ve pom.xml Maven proje dosyasını bir metin düzenleyicisinde açın.
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-thymeleaf
iç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 şeklindedir3.0.4.RELEASE
.Pom.xml dosyasını kaydedin ve kapatın.
- komutunu çalıştırarak
mvn -DskipTests clean install
bağımlılıklarınızın doğru olduğunu doğrulayın. seçeneğini görmüyorsanızBUILD SUCCESS
devam etmeden önce sorunu giderin ve çözün.
- komutunu çalıştırarak
Projenizdeki src/main/resources klasörüne gidin ve bir metin düzenleyicisinde application.yml dosyası oluşturun.
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.
application.yml dosyasını kaydedip kapatın.
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.<Controller klasöründe WebController.java adlı yeni bir Java dosyası oluşturun ve bir metin düzenleyicide açın.
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. 'denuser.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.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.<Security klasöründe WebSecurityConfiguration.java adlı yeni bir Java dosyası oluşturun ve bir metin düzenleyicide açın.
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) ; } }
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
Komut istemini açın ve dizini değiştirip uygulamanızın pom.xml dosyasının bulunduğu klasöre geçin.
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:10Z
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
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.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.
Başarıyla oturum açtıktan sonra tarayıcıdan örneği
home page
görmeniz gerekir.
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 attributes
bir ö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 localhost
kirli ç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.