Aracılığıyla paylaş


Azure Active Directory B2C kullanarak Java Spring Boot uygulamalarının güvenliğini sağlama

Bu makalede, Java için Azure AD B2C Spring Boot Starter istemci kitaplığını kullanarak Azure Active Directory B2C kiracınızdaki kullanıcılarda oturum açan bir Java Spring Boot web uygulaması gösterilmektedir. OpenID Connect protokolunu kullanır.

Aşağıdaki diyagramda uygulamanın topolojisi gösterilmektedir:

Diagram that shows the topology of the app.Uygulamanın topolojisini gösteren diyagram.

İstemci uygulaması, bir kullanıcıda oturum açmak ve Azure AD B2C'den kimlik belirteci almak için Java için Azure AD B2C Spring Boot Starter istemci kitaplığını kullanır. Kimlik belirteci, kullanıcının Azure AD B2C ile kimliğinin doğrulandığını kanıtlar ve kullanıcının korumalı yollara erişmesini sağlar.

Önkoşullar

Öneriler

Örneği ayarlama

Aşağıdaki bölümlerde örnek uygulamanın nasıl ayarlanacağı gösterilmektedir.

Örnek depoyu kopyalama veya indirme

Örneği kopyalamak için bir Bash penceresi açın ve aşağıdaki komutu kullanın:

git clone https://github.com/Azure-Samples/ms-identity-msal-java-samples.git
cd 4-spring-web-app/1-Authentication/sign-in-b2c

Alternatif olarak, ms-identity-msal-java-samples deposuna gidin, ardından .zip dosyası olarak indirin ve sabit sürücünüze ayıklayın.

Önemli

Windows'ta dosya yolu uzunluğu sınırlamalarını önlemek için depoyu sabit sürücünüzün köküne yakın bir dizine kopyalayın veya ayıklayın.

Bu örnek, tanıtım amacıyla önceden kayıtlı bir uygulamayla birlikte gelir. Kendi Azure AD B2C kiracınızı ve uygulamanızı kullanmak istiyorsanız uygulamayı Azure portalında kaydedin ve yapılandırın. Daha fazla bilgi için Uygulamayı kaydetme bölümüne bakın. Aksi takdirde, Örneği çalıştırma bölümündeki adımlarla devam edin.

Uygulamalarınızı oluşturmak istediğiniz Azure AD B2C kiracısını seçin

Kiracınızı seçmek için aşağıdaki adımları kullanın:

  1. Azure Portal’ında oturum açın.

  2. Hesabınız birden fazla Azure AD B2C kiracısında mevcutsa, Azure portalının köşesinde profilinizi seçin ve ardından Dizini değiştir'i seçerek oturumunuzu istediğiniz Azure AD B2C kiracısına değiştirin.

Kullanıcı akışları ve özel ilkeler oluşturma

Kaydolma, oturum açma, profil düzenleme ve parola sıfırlama gibi yaygın kullanıcı akışları oluşturmak için bkz . Öğretici: Azure Active Directory B2C'de kullanıcı akışları oluşturma.

Azure Active Directory B2C'de de özel ilkeler oluşturmayı düşünmelisiniz. Ancak, bu görev bu öğreticinin kapsamının dışındadır. Daha fazla bilgi için bkz . Azure AD B2C özel ilkesine genel bakış.

Dış kimlik sağlayıcıları ekleme

Bkz . Öğretici: Azure Active Directory B2C'de uygulamalarınıza kimlik sağlayıcıları ekleme.

Uygulamayı kaydetme (java-spring-webapp-auth-b2c)

Uygulamayı kaydetmek için aşağıdaki adımları kullanın:

  1. Azure portalına gidin ve Azure AD B2C'yi seçin.

  2. Gezinti bölmesinde Uygulama Kayıtları'nı ve ardından Yeni kayıt'ı seçin.

  3. Görüntülenen Uygulamayı kaydet sayfasında aşağıdaki uygulama kayıt bilgilerini girin:

    • Ad bölümünde, uygulamanın kullanıcılarına görüntülenmesi için anlamlı bir uygulama adı girin. Örneğin, java-spring-webapp-auth-b2c.
    • Desteklenen hesap türleri altında, herhangi bir kimlik sağlayıcısı veya kuruluş dizinindeki hesaplar (Kullanıcı akışı olan kullanıcıların kimliklerini doğrulamak için) seçeneğini belirleyin.
    • Yeniden Yönlendirme URI'si (isteğe bağlı) bölümünde, birleşik giriş kutusunda Web'i seçin ve aşağıdaki yeniden yönlendirme URI'sini girin: http://localhost:8080/login/oauth2/code/.
  4. Uygulamayı kaydetmek için Kaydet'i seçin.

  5. Uygulamanın kayıt sayfasında, daha sonra kullanmak üzere Uygulama (istemci) kimliği değerini bulun ve kopyalayın. Bu değeri uygulamanızın yapılandırma dosyasında veya dosyalarında kullanırsınız.

  6. Yaptığınız değişiklikleri kaydetmek için Kaydet'i seçin.

  7. Uygulamanın kayıt sayfasında, gizli dizi oluşturmak ve sertifikaları karşıya yüklemek için sayfayı açmak için gezinti bölmesindeki Sertifikalar ve gizli diziler bölmesini seçin.

  8. Gizli anahtarlar bölümünün altında, Yeni gizli anahtar'ı seçin.

  9. Uygulama gizli dizisi gibi bir açıklama yazın.

  10. Güvenlikle ilgili endişelerinize göre kullanılabilir sürelerden birini (örneğin, 2 yıl içinde) seçin.

  11. Ekle'yi seçin. Oluşturulan değer görüntülenir.

  12. Oluşturulan değeri kopyalayıp sonraki adımlarda kullanmak üzere kaydedin. Kodunuzun yapılandırma dosyaları için bu değere ihtiyacınız vardır. Bu değer yeniden görüntülenmez ve başka bir yolla alamazsınız. Bu nedenle, başka bir ekrana veya bölmeye gitmeden önce Azure portalından kaydettiğinizden emin olun.

Uygulamayı (java-spring-webapp-auth-b2c) uygulama kaydınızı kullanacak şekilde yapılandırma

Uygulamayı yapılandırmak için aşağıdaki adımları kullanın:

Not

Aşağıdaki adımlarda veya ClientIDAppIdile Application ID aynıdır.

  1. Projeyi IDE'nizde açın.

  2. src/main/resources/application.yml dosyasını açın.

  3. client-id özelliğini bulun ve mevcut değeri Azure portalından uygulama kimliğiyle veya clientIdjava-spring-webapp-auth-b2c uygulamanın kimliğiyle değiştirin.

  4. client-secret özelliğini bulun ve mevcut değeri Azure portalından uygulamanın oluşturulması java-spring-webapp-auth-b2c sırasında kaydettiğiniz değerle değiştirin.

  5. base-uri özelliğini bulun ve değerinin fabrikamb2c iki örneğini, Uygulamayı Azure portalında oluşturduğunuz java-spring-webapp-auth-b2c Azure AD B2C kiracısının adıyla değiştirin.

  6. sign-up-or-sign-in özelliğini bulun ve azure portalında uygulamayı oluşturduğunuz Azure AD B2C kiracısında oluşturduğunuz kaydolma/oturum açma kullanıcı akışı ilkesinin java-spring-webapp-auth-b2c adıyla değiştirin.

  7. profile-edit özelliğini bulun ve azure portalında uygulamayı oluşturduğunuz java-spring-webapp-auth-b2c Azure AD B2C kiracısında oluşturduğunuz parola sıfırlama kullanıcı akışı ilkesinin adıyla değiştirin.

  8. password-reset özelliğini bulun ve azure portalında uygulamayı oluşturduğunuz Azure AD B2C kiracısında oluşturduğunuz profil düzenleme kullanıcı akışı ilkesinin java-spring-webapp-auth-b2c adıyla değiştirin.

  9. src/main/resources/templates/navbar.html dosyasını açın.

  10. ve akışlarına b2c_1_susi yönelik başvuruları bulun ve bunları ve profile-edit kullanıcı akışlarınızla sign-up-sign-inb2c_1_edit_profile değiştirin.

Örneği çalıştırma

Aşağıdaki bölümlerde, örneğin Azure Container Apps'e nasıl dağıtılacağı gösterilmektedir.

Önkoşullar

  • Azure hesabı. Aboneliğiniz yoksa ücretsiz bir hesap oluşturun. Devam etmek için Azure aboneliğinde Contributor veya Owner iznine ihtiyacınız vardır. Daha fazla bilgi edinmek için bkz. Azure portal kullanarak Azure rolleri atama.
  • Azure CLI.
  • Azure Container Apps CLI uzantısı, sürümü 0.3.47 veya üstü. En son sürümü yüklemek için komutunu kullanın az extension add --name containerapp --upgrade --allow-preview .
  • Java Geliştirme Seti, sürüm 17 veya üzeri.
  • Maven.

Spring projesini hazırlama

Projeyi hazırlamak için aşağıdaki adımları kullanın:

  1. Projeyi oluşturmak için aşağıdaki Maven komutunu kullanın:

    mvn clean verify
    
  2. Aşağıdaki komutu kullanarak örnek projeyi yerel olarak çalıştırın:

    mvn spring-boot:run
    

Ayarlama

CLI'dan Azure'da oturum açmak için aşağıdaki komutu çalıştırın ve istemleri izleyerek kimlik doğrulama işlemini tamamlayın.

az login

CLI'nın en son sürümünü çalıştırdığınızdan emin olmak için yükseltme komutunu çalıştırın.

az upgrade

Ardından CLI için Azure Container Apps uzantısını yükleyin veya güncelleştirin.

Azure CLI'da komut çalıştırırken az containerapp eksik parametrelerle ilgili hatalar alırsanız, Azure Container Apps uzantısının en son sürümünü yüklediğinizden emin olun.

az extension add --name containerapp --upgrade

Not

Mayıs 2024'den itibaren Azure CLI uzantıları artık önizleme özelliklerini varsayılan olarak etkinleştirmez. Container Apps önizleme özelliklerine erişmek için ile --allow-preview trueContainer Apps uzantısını yükleyin.

az extension add --name containerapp --upgrade --allow-preview true

Geçerli uzantı veya modül yüklendikten sonra ve Microsoft.OperationalInsights ad alanlarını kaydedinMicrosoft.App.

Not

Azure Container Apps kaynakları ad alanından Microsoft.Web ad alanına Microsoft.App geçirildi. Daha fazla ayrıntı için Microsoft.Web'den Mart 2022'de Microsoft.App ad alanı geçişi bölümüne bakın.

az provider register --namespace Microsoft.App
az provider register --namespace Microsoft.OperationalInsights

Azure Container Apps ortamını oluşturma

Azure CLI kurulumunuz tamamlandıktan sonra bu makalenin tamamında kullanılan ortam değişkenlerini tanımlayabilirsiniz.

Bash kabuğunuzda aşağıdaki değişkenleri tanımlayın.

export RESOURCE_GROUP="ms-identity-containerapps"
export LOCATION="canadacentral"
export ENVIRONMENT="env-ms-identity-containerapps"
export API_NAME="ms-identity-api"
export JAR_FILE_PATH_AND_NAME="./target/ms-identity-spring-boot-webapp-0.0.1-SNAPSHOT.jar"

Kaynak grubu oluşturun.

az group create  \
    --name $RESOURCE_GROUP \
    --location $LOCATION \

Otomatik olarak oluşturulan log analytics çalışma alanıyla bir ortam oluşturun.

az containerapp env create \
    --name $ENVIRONMENT \
    --resource-group $RESOURCE_GROUP \
    --location $LOCATION

Kapsayıcı uygulaması ortamının varsayılan etki alanını gösterin. Sonraki bölümlerde kullanmak için bu etki alanını not edin.

az containerapp env show \
    --name $ENVIRONMENT \
    --resource-group $RESOURCE_GROUP \
    --query properties.defaultDomain

Uygulamayı dağıtım için hazırlama

Uygulamanızı Azure Container Apps'e dağıttığınızda, yeniden yönlendirme URL'niz Azure Container Apps'te dağıtılan uygulama örneğinizin yeniden yönlendirme URL'sine dönüşür. application.yml dosyanızdaki bu ayarları değiştirmek için aşağıdaki adımları kullanın:

  1. Aşağıdaki örnekte gösterildiği gibi uygulamanızın src\main\resources\application.yml dosyasına gidin ve değerini post-logout-redirect-uri dağıtılan uygulamanızın etki alanı adıyla değiştirin. ve <default-domain-of-container-app-environment> değerlerini gerçek değerlerinizle değiştirmeyi <API_NAME> unutmayın. Örneğin, önceki adımdaki Azure Container App ortamınızın varsayılan etki alanıyla ve ms-identity-api uygulama adınız için değeri için post-logout-redirect-uri kullanabilirsinizhttps://ms-identity-api.<default-domain>.

    post-logout-redirect-uri: https://<API_NAME>.<default-domain-of-container-app-environment>
    
  2. Bu dosyayı kaydettikten sonra uygulamanızı yeniden derlemek için aşağıdaki komutu kullanın:

    mvn clean package
    

Önemli

Uygulamanın application.yml dosyası şu anda parametresindeki istemci gizli dizinizin değerini barındırıyor client-secret . Bu değeri bu dosyada tutmak iyi bir uygulama değildir. Dosyayı bir Git deposuna işlerseniz de risk alıyor olabilirsiniz. Önerilen yaklaşım için bkz . Azure Container Apps'te gizli dizileri yönetme.

Microsoft Entra ID uygulama kaydınızı güncelleştirme

Azure Container Apps'te yeniden yönlendirme URI'si dağıtılan uygulamanızda değiştiğinden, Microsoft Entra Id uygulama kaydınızda yeniden yönlendirme URI'sini de değiştirmeniz gerekir. Bu değişikliği yapmak için aşağıdaki adımları kullanın:

  1. Geliştiriciler için Microsoft kimlik platformu Uygulama kayıtları sayfasına gidin.

  2. Uygulama kaydınızı aramak için arama kutusunu kullanın; örneğin, java-servlet-webapp-authentication.

  3. Adını seçerek uygulama kaydınızı açın.

  4. Menüden Kimlik Doğrulaması'nı seçin.

  5. Web - Yeniden Yönlendirme URI'leri bölümünde URI Ekle'yi seçin.

  6. Uygulamanızın URI'sini doldurun; örneğin, https://<containerapp-name>.<default domain of container app environment>/login/oauth2/code/öğesini ekleyerek /login/oauth2/code/ .

  7. Kaydet'i seçin.

Uygulamayı dağıtma

JAR paketini Azure Container Apps'e dağıtın.

Not

Gerekirse Java derleme ortamı değişkenlerinde JDK sürümünü belirtebilirsiniz. Daha fazla bilgi için bkz . Azure Container Apps'te Java için ortam değişkenleri oluşturma.

Artık CLI komutuyla az containerapp up WAR dosyanızı dağıtabilirsiniz.

az containerapp up \
    --name $API_NAME \
    --resource-group $RESOURCE_GROUP \
    --location $LOCATION \
    --environment $ENVIRONMENT \
    --artifact <JAR_FILE_PATH_AND_NAME> \
    --ingress external \
    --target-port 8080 \
    --query properties.configuration.ingress.fqdn

Not

Varsayılan JDK sürümü 17'dir. Uygulamanızla uyumluluk için JDK sürümünü değiştirmeniz gerekiyorsa, sürüm numarasını ayarlamak için bağımsız değişkenini --build-env-vars BP_JVM_VERSION=<YOUR_JDK_VERSION> kullanabilirsiniz.

Daha fazla derleme ortamı değişkeni için bkz . Azure Container Apps'te Java için ortam değişkenleri oluşturma.

Uygulamayı doğrulama

Bu örnekte komut, containerapp up uygulamanın URL'si olarak da bilinen tam etki alanı adını (FQDN) döndüren bağımsız değişkenini içerir --query properties.configuration.ingress.fqdn . Herhangi bir dağıtım sorununu araştırmak üzere uygulamanın günlüklerini denetlemek için aşağıdaki adımları kullanın:

  1. Dağıtım bölümünün Çıkışlar sayfasından çıkış uygulaması URL'sine erişin.

  2. Azure Container Apps örneğine Genel Bakış sayfasının gezinti bölmesinden Günlükler'i seçerek uygulamanın günlüklerini denetleyin.

Örneği keşfetme

Örneği keşfetmek için aşağıdaki adımları kullanın:

  1. Ekranın ortasında oturum açma veya oturum kapatma durumunun görüntülendiğine dikkat edin.
  2. Köşedeki bağlama duyarlı düğmeyi seçin. Bu düğme, uygulamayı ilk kez çalıştırdığınızda Oturum Aç'ı okur. Alternatif olarak, belirteç ayrıntılarının bağlantısını seçin. Bu sayfa korumalı olduğundan ve kimlik doğrulaması gerektirdiğinden, otomatik olarak oturum açma sayfasına yönlendirilirsiniz.
  3. Sonraki sayfada yönergeleri izleyin ve seçtiğiniz kimlik sağlayıcısının bir hesabıyla oturum açın. E-posta adresi kullanarak B2C kiracısında yerel bir hesaba kaydolmayı veya oturum açmayı da seçebilirsiniz.
  4. Oturum açma akışını başarıyla tamamladıktan sonra, oturum açma akışınızı tetikleyen düğmeye bağlı olarak oturum açma durumunu gösteren giriş sayfasına veya belirteç ayrıntıları sayfasına yönlendirilmelisiniz.
  5. Bağlama duyarlı düğmenin artık Oturumu kapat ifadesinin yer aldığından ve kullanıcı adınızı görüntülediğine dikkat edin.
  6. Giriş sayfasındaysanız kimlik belirtecinin çözülen taleplerinden bazılarını görmek için Kimlik Belirteci Ayrıntıları'nı seçin.
  7. Profilinizi düzenleyin. Görünen adınız, ikamet yeriniz ve mesleğiniz gibi ayrıntıları değiştirmek için profili düzenle'yi seçin.
  8. Oturumu kapatmak için köşedeki düğmeyi kullanın. Durum sayfası yeni durumu yansıtır.

Kod hakkında

Bu örnek, Kullanıcıları Azure AD B2C kiracınızda oturum açmak üzere Java için Azure AD B2C Spring Boot Starter istemci kitaplığının nasıl kullanılacağını gösterir. Örnek ayrıca Spring Oauth2 İstemcisi ve Spring Web önyükleme başlatıcılarını da kullanır. Örnek, oturum açmış kullanıcının ayrıntılarını görüntülemek için Azure AD B2C'den alınan kimlik belirtecinden gelen talepleri kullanır.

İçindekiler

Aşağıdaki tabloda örnek proje klasörünün içeriği gösterilmektedir:

Dosya/klasör Açıklama
pom.xml Uygulama bağımlılıkları.
src/main/resources/templates/ Kullanıcı arabirimi için Kekik Şablonları.
src/main/resources/application.yml Uygulama ve Microsoft Entra Boot Starter kitaplık yapılandırması.
src/main/java/com/microsoft/azuresamples/msal4j/msidentityspringbootwebapp/ Bu dizin ana uygulama giriş noktasını, denetleyiciyi ve yapılandırma sınıflarını içerir.
.../MsIdentitySpringBootWebappApplication.java Ana sınıf.
.../SampleController.java Uç nokta eşlemeleri olan denetleyici.
.../SecurityConfig.java Güvenlik yapılandırması - örneğin, hangi yolların kimlik doğrulaması gerektirdiği.
.../Utilities.java Yardımcı program sınıfı - örneğin, filtre kimliği belirteci talepleri.
CHANGELOG.md Örnekteki değişikliklerin listesi.
CONTRIBUTING.md Örneğe katkıda bulunma yönergeleri.
LİSANS Örneğin lisansı.

Kimlik belirteci talepleri

Belirteç ayrıntılarını ayıklamak için uygulama, aşağıdaki örnekte gösterildiği gibi, aşağıdaki örnekte gösterildiği gibi bir istek eşlemesinde Spring Security'nin AuthenticationPrincipal ve OidcUser nesnesini kullanır. Bu uygulamanın kimlik belirteci taleplerini nasıl kullandığına ilişkin tüm ayrıntılar için Örnek Denetleyici'ye bakın.

import org.springframework.security.oauth2.core.oidc.user.OidcUser;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
//...
@GetMapping(path = "/some_path")
public String tokenDetails(@AuthenticationPrincipal OidcUser principal) {
    Map<String, Object> claims = principal.getIdToken().getClaims();
}

Oturum açmak için uygulama, aşağıdaki örnekte gösterildiği gibi Java için Azure AD B2C Spring Boot Starter istemci kitaplığı tarafından otomatik olarak yapılandırılan Azure AD B2C oturum açma uç noktasına bir istekte bulunur:

<a class="btn btn-success" href="/oauth2/authorization/{your-sign-up-sign-in-user-flow}">Sign In</a>

Oturum kapatma için uygulama, aşağıdaki örnekte gösterildiği gibi uç noktaya bir POST isteğinde logout bulunur:

<form action="#" th:action="@{/logout}" method="post">
  <input class="btn btn-warning" type="submit" value="Sign Out" />
</form>

Kimlik doğrulamasına bağımlı kullanıcı arabirimi öğeleri

Uygulamanın kullanıcı arabirimi şablonu sayfalarında, Spring Security Thymeleaf etiketlerini kullanan aşağıdaki örnekte gösterildiği gibi, kullanıcının kimliğinin doğrulanıp doğrulanmadığına göre görüntülenecek içeriği belirlemek için bazı basit mantık vardır:

<div sec:authorize="isAuthenticated()">
  this content only shows to authenticated users
</div>
<div sec:authorize="isAnonymous()">
  this content only shows to not-authenticated users
</div>

WebSecurityConfigurerAdapter ile yolları koruma

Varsayılan olarak, uygulama kimlik belirteci ayrıntıları sayfasını yalnızca oturum açmış kullanıcıların erişebilmesi için korur. Uygulama, application.yml dosyasından app.protect.authenticated özelliğinden bu yolları yapılandırıyor. Uygulamanızın özel gereksinimlerini yapılandırmak için sınıflarınızdan birini genişletebilirsiniz WebSecurityConfigurerAdapter . Örneğin, aşağıdaki kodda gösterilen bu uygulamanın SecurityConfig sınıfına bakın:

@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Value("${app.protect.authenticated}")
    private String[] protectedRoutes;

    private final AADB2COidcLoginConfigurer configurer;

    public SecurityConfig(AADB2COidcLoginConfigurer configurer) {
        this.configurer = configurer;
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        // @formatter:off
        http.authorizeRequests()
            .antMatchers(protectedRoutes).authenticated()     // limit these pages to authenticated users (default: /token_details)
            .antMatchers("/**").permitAll()                  // allow all other routes.
            .and()
            .apply(configurer)
            ;
        // @formatter:off
    }
}

Daha Fazla Bilgi

OAuth 2.0 protokollerinin bu senaryoda ve diğer senaryolarda nasıl çalıştığı hakkında daha fazla bilgi için bkz . Microsoft Entra Id için Kimlik Doğrulama Senaryoları.