Spring Security için Spring Cloud Azure desteği

Bu makale şunlar için geçerlidir:✅ Sürüm 4.19.0 ✅ Sürüm 5.19.0

Bu makalede Spring Cloud Azure ve Spring Security'nin birlikte nasıl kullanılabildiği açıklanmaktadır.

Microsoft Entra Id ile Spring Security

Web uygulaması oluştururken kimlik ve erişim yönetimi her zaman temel parçalar olacaktır.

Azure, yalnızca bulut tabanlı kimlik hizmeti değil, azure ekosisteminin geri kalanıyla da derin tümleştirme sunduğundan, uygulama geliştirme yolculuğunuzu demokratikleştirmek için harika bir platform sunar.

Spring Security, güçlü soyutlamalar ve genişletilebilir arabirimlerle Spring tabanlı uygulamalarınızın güvenliğini sağlamayı kolaylaştırdı. Ancak Spring çerçevesi ne kadar güçlü olursa olsun, belirli bir kimlik sağlayıcısına uyarlanmamıştır.

spring-cloud-azure-starter-active-directory, web uygulamanızı bir Microsoft Entra Id (kısa için Microsoft Entra Id) kiracısına bağlamak ve kaynak sunucunuzu Microsoft Entra Id ile korumak için en uygun yolu sağlar. Web uygulamalarını ve kaynak sunucularını korumak için Oauth 2.0 protokolunu kullanır.

Web uygulamasına erişme

Bu senaryoda, microsoft hesabı olan bir kullanıcıda oturum açmak için OAuth 2.0 yetkilendirme kodu akışı kullanılır.

Sistem Diyagramı

Tek başına web uygulaması için sistem diyagramını .

Azure'da gerekli kaynakları oluşturma

  1. Hızlı Başlangıç: Bir uygulamayıMicrosoft kimlik platformuna kaydetme makalesini okuyun.

  2. Uygulama kaydı oluşturun. AZURE_TENANT_IDalın, AZURE_CLIENT_IDve AZURE_CLIENT_SECRET.

  3. redirect URI APPLICATION_BASE_URI/login/oauth2/code/ olarak ayarlayın, örneğin http://localhost:8080/login/oauth2/code/. Kuyruk / gereklidir.

Gerekli bağımlılıkları ekleme

<dependencies>
    <dependency>
        <groupId>com.azure.spring</groupId>
        <artifactId>spring-cloud-azure-starter-active-directory</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-oauth2-client</artifactId>
    </dependency>
</dependencies>

Gerekli özellikleri ekleme

spring:
  cloud:
    azure:
      active-directory:
        enabled: true
        profile:
          tenant-id: <tenant>
        credential:
          client-id: ${AZURE_CLIENT_ID}
          client-secret: ${AZURE_CLIENT_SECRET}

Not

tenant-id için izin verilen değerler şunlardır: common, organizations, consumersveya kiracı kimliği. Bu değerler hakkında daha fazla bilgi için, Hata AADSTS50020 - Kimlik sağlayıcısından kullanıcı hesabı kiracımevcut değil bölümünün Yanlış uç nokta (kişisel ve kuruluş hesapları) kullanıldı bölümüne bakın. Tek kiracılı uygulamanızı dönüştürme hakkında bilgi için bkz. Tek kiracılı uygulamayı Microsoft Entra IDüzerinde çok kiracılıya dönüştürme.

Şimdi uygulamanızı başlatın ve tarayıcı üzerinden uygulamanıza erişin. Microsoft oturum açma sayfasına yönlendirilirsiniz.

Gelişmiş kullanımlar

Ek güvenlik yapılandırmaları ekleme
  • Spring Cloud Azure 5.x
  • Spring Cloud Azure 4.x
@Configuration(proxyBeanMethods = false)
@EnableWebSecurity
@EnableMethodSecurity
public class AadOAuth2LoginSecurityConfig {

   /**
    * Add configuration logic as needed.
    */
   @Bean
   SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
       http.apply(AadWebApplicationHttpSecurityConfigurer.aadWebApplication())
               .and()
           .authorizeHttpRequests()
               .anyRequest().authenticated();
           // Do some custom configuration.
       return http.build();
   }
}
Uygulama rollerine göre erişimi yetkilendirme

Azure'da gerekli kaynakları oluşturma:

  • Uygulamanıza uygulama rolleri ekleme okuyun ve bunlarıbelirteçte alın.

  • Aşağıdaki parametrelerle bir uygulama rolü oluşturun:

    • Görünen ad: Yönetici
    • İzin verilen üye türleri: Kullanıcılar/Gruplar
    • Değer: Yönetici
    • Bu uygulama rolünü etkinleştirmek istiyor musunuz: evet

Not

Uygulama rolü tabanlı erişim denetimini kullanmak istiyorsanız, role talebine grup adları koyamazsınız. Daha fazla bilgi için İsteğe bağlı talepleri yapılandırmauygulamanıza isteğe bağlı talepler sağlama bölümüne bakın.

Belirli bir yöntemi koruyun.

class Demo {
   @GetMapping("Admin")
   @ResponseBody
   @PreAuthorize("hasAuthority('APPROLE_Admin')")
   public String admin() {
       return "Admin message";
   }
}
Erişimi grup adına veya grup kimliğine göre yetkilendirme

İlgili yapılandırma özelliklerini ekleyin.

spring:
 cloud:
   azure:
     active-directory:
       enabled: true
       user-group:
         allowed-group-names: group1_name_1, group2_name_2
         # 1. If allowed-group-ids == all, then all group ID will take effect.
         # 2. If "all" is used, we should not configure other group ids.
         # 3. "all" is only supported for allowed-group-ids, not supported for allowed-group-names.
         allowed-group-ids: group_id_1, group_id_2

Belirli bir yöntemi koruyun.

@Controller
public class RoleController {
   @GetMapping("group1")
   @ResponseBody
   @PreAuthorize("hasRole('ROLE_group1')")
   public String group1() {
       return "group1 message";
   }

   @GetMapping("group2")
   @ResponseBody
   @PreAuthorize("hasRole('ROLE_group2')")
   public String group2() {
       return "group2 message";
   }

   @GetMapping("group1Id")
   @ResponseBody
   @PreAuthorize("hasRole('ROLE_<group1-id>')")
   public String group1Id() {
       return "group1Id message";
   }

   @GetMapping("group2Id")
   @ResponseBody
   @PreAuthorize("hasRole('ROLE_<group2-id>')")
   public String group2Id() {
       return "group2Id message";
   }
}
Genel Azure yerine Ulusal Azure kullanma

Genel Azure bulutu dışında, Microsoft Entra ID şu ulusal bulutlara dağıtılır:

  • Azure Kamu

  • Azure China 21Vianet

  • Azure Almanya

Azure China 21Vianet'i kullanan bir örnek aşağıda verilmiştır.

spring:
  cloud:
    azure:
      active-directory:
        enabled: true
        base-uri: https://login.partner.microsoftonline.cn
        graph-base-uri: https://microsoftgraph.chinacloudapi.cn

Daha fazla bilgi için bkz.Ulusal bulut dağıtımları.

Yeniden yönlendirme URI şablonunu yapılandırma

Geliştiriciler redirect-uri'yi özelleştirebilir.

Yeniden yönlendirme URI'leri için sistem diyagramını .

redirect-uri-template dosyanıza özellikleri ekleyin.

spring:
 cloud:
   azure:
     active-directory:
       enabled: true
       redirect-uri-template: ${REDIRECT-URI-TEMPLATE}

Azure portalında redirect-uri güncelleştirin.

yeniden yönlendirme URI'sini yapılandırma şablonunu .

redirect-uri-templateayarladıktan sonra güvenlik oluşturucusunu güncelleştirmemiz gerekir:

  • Spring Cloud Azure 5.x
  • Spring Cloud Azure 4.x
@Configuration(proxyBeanMethods = false)
@EnableWebSecurity
@EnableMethodSecurity
public class AadOAuth2LoginSecurityConfig {

    /**
     * Add configuration logic as needed.
     */
    @Bean
    public SecurityFilterChain htmlFilterChain(HttpSecurity http) throws Exception {
        // @formatter:off
        http.apply(AadWebApplicationHttpSecurityConfigurer.aadWebApplication())
                .and()
            .oauth2Login()
                .loginProcessingUrl("${REDIRECT-URI-TEMPLATE}")
                .and()
            .authorizeHttpRequests()
                .anyRequest().authenticated();
        // @formatter:on
        return http.build();
    }
}

Ara sunucu aracılığıyla Microsoft Entra Id'ye bağlanma

Microsoft Entra Id'yi ara sunucu aracılığıyla bağlamak için aşağıdaki örnekte gösterilene benzer bir RestTemplateCustomizer çekirdeği sağlayın:

@Configuration
class DemoConfiguration {
    @Bean
    public RestTemplateCustomizer proxyRestTemplateCustomizer() {
        return (RestTemplate restTemplate) -> {
            Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(PROXY_SERVER_HOST, PROXY_SERVER_PORT));
            SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();
            requestFactory.setProxy(proxy);
            restTemplate.setRequestFactory(requestFactory);
        };
    }
}

Örnekleri

Örnek proje: aad-web-application.

Kaynak sunucularına erişen web uygulaması

Sistem Diyagramı

Kaynak sunucularına erişen bir web uygulaması için sistem diyagramını .

Azure'da Gerekli Kaynakları Oluşturma

  1. Hızlı Başlangıç: Bir uygulamayıMicrosoft kimlik platformuna kaydetme makalesini okuyun.

  2. Uygulama kaydı oluşturun. AZURE_TENANT_IDalın, AZURE_CLIENT_IDve AZURE_CLIENT_SECRET.

  3. redirect URI APPLICATION_BASE_URI/login/oauth2/code/olarak ayarlayın, örneğin http://localhost:8080/login/oauth2/code/. Kuyruk / gereklidir.

Gerekli bağımlılıkları ekleme

<dependencies>
    <dependency>
        <groupId>com.azure.spring</groupId>
        <artifactId>spring-cloud-azure-starter-active-directory</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-oauth2-client</artifactId>
    </dependency>
</dependencies>

Gerekli özellikleri ekleme

spring:
  cloud:
    azure:
      active-directory:
        enabled: true
        profile:
          tenant-id: <tenant>
        credential:
          client-id: ${AZURE_CLIENT_ID}
          client-secret: ${AZURE_CLIENT_SECRET}
        authorization-clients:
          graph:
            scopes: https://graph.microsoft.com/Analytics.Read, email

Not

tenant-id için izin verilen değerler şunlardır: common, organizations, consumersveya kiracı kimliği. Bu değerler hakkında daha fazla bilgi için, Hata AADSTS50020 - Kimlik sağlayıcısından kullanıcı hesabı kiracımevcut değil bölümünün Yanlış uç nokta (kişisel ve kuruluş hesapları) kullanıldı bölümüne bakın. Tek kiracılı uygulamanızı dönüştürme hakkında bilgi için bkz. Tek kiracılı uygulamayı Microsoft Entra IDüzerinde çok kiracılıya dönüştürme.

Burada graphOAuth2AuthorizedClientadıdır scopes oturum açarken onay vermek için gereken kapsamlar anlamına gelir.

Uygulamanızda OAuth2AuthorizedClient kullanma

public class Demo {
    @GetMapping("/graph")
    @ResponseBody
    public String graph(
    @RegisteredOAuth2AuthorizedClient("graph") OAuth2AuthorizedClient graphClient) {
        // toJsonString() is just a demo.
        // oAuth2AuthorizedClient contains access_token. We can use this access_token to access resource server.
        return toJsonString(graphClient);
    }
}

Şimdi uygulamanızı başlatın ve tarayıcıdan uygulamanıza erişin. Ardından Microsoft oturum açma sayfasına yönlendirilirsiniz.

Gelişmiş kullanımlar

İstemci Kimlik Bilgisi Akışı

Varsayılan akış,yetkilendirme kodu akışıdır,istemci kimlik bilgileri akışını kullanmak istiyorsanız aşağıdaki gibi yapılandırabilirsiniz:

spring:
  cloud:
    azure:
      active-directory:
        enabled: true
        profile:
          tenant-id: <tenant>
        credential:
          client-id: ${AZURE_CLIENT_ID}
          client-secret: ${AZURE_CLIENT_SECRET}
        authorization-clients:
          graph:
            authorization-grant-type: client_credentials # Change type to client_credentials
            scopes: https://graph.microsoft.com/Analytics.Read, email

Not

tenant-id için izin verilen değerler şunlardır: common, organizations, consumersveya kiracı kimliği. Bu değerler hakkında daha fazla bilgi için, Hata AADSTS50020 - Kimlik sağlayıcısından kullanıcı hesabı kiracımevcut değil bölümünün Yanlış uç nokta (kişisel ve kuruluş hesapları) kullanıldı bölümüne bakın. Tek kiracılı uygulamanızı dönüştürme hakkında bilgi için bkz. Tek kiracılı uygulamayı Microsoft Entra IDüzerinde çok kiracılıya dönüştürme.

Birden çok kaynak sunucusuna erişme

Bir web uygulamasında, aşağıdaki gibi yapılandırarak birden çok kaynak sunucusuna erişebilirsiniz:

spring:
  cloud:
    azure:
      active-directory:
        enabled: true
        profile:
          tenant-id: <tenant>
        credential:
          client-id: ${AZURE_CLIENT_ID}
          client-secret: ${AZURE_CLIENT_SECRET}
        authorization-clients:
          resource-server-1:
            scopes: # Scopes for resource-server-1
          resource-server-2:
            scopes: # Scopes for resource-server-2

Not

tenant-id için izin verilen değerler şunlardır: common, organizations, consumersveya kiracı kimliği. Bu değerler hakkında daha fazla bilgi için, Hata AADSTS50020 - Kimlik sağlayıcısından kullanıcı hesabı kiracımevcut değil bölümünün Yanlış uç nokta (kişisel ve kuruluş hesapları) kullanıldı bölümüne bakın. Tek kiracılı uygulamanızı dönüştürme hakkında bilgi için bkz. Tek kiracılı uygulamayı Microsoft Entra IDüzerinde çok kiracılıya dönüştürme.

Daha sonra OAuth2AuthorizedClient bu şekilde kullanabilirsiniz

public class Demo {
    @GetMapping("/resource-server-1")
    @ResponseBody
    public String graph(
    @RegisteredOAuth2AuthorizedClient("resource-server-1") OAuth2AuthorizedClient client) {
        return callResourceServer1(client);
    }

    @GetMapping("/resource-server-2")
    @ResponseBody
    public String graph(
    @RegisteredOAuth2AuthorizedClient("resource-server-2") OAuth2AuthorizedClient client) {
        return callResourceServer2(client);
    }
}

Örnekleri

Örnek proje: aad-web-application.

Kaynak sunucusuna erişme

Bu senaryo oturum açmayı desteklemez, yalnızca erişim belirtecini doğrulayarak sunucuyu koruyun. Erişim belirteci geçerliyse, sunucu isteğe hizmet eder.

Sistem Diyagramı

Tek başına kaynak sunucusu kullanımı için Sistem diyagramını .

Azure'da gerekli kaynakları oluşturma

  1. Hızlı Başlangıç: Bir uygulamayıMicrosoft kimlik platformuna kaydetme makalesini okuyun.

  2. Uygulama kaydı oluşturun. AZURE_CLIENT_IDalın.

  3. Hızlı Başlangıç: Web API'sinikullanıma açmak için bir uygulama yapılandırma okuyun.

  4. Scope-1adlı bir kapsama sahip bir web API'si kullanıma sunma.

Gerekli bağımlılıkları ekleme

<dependencies>
    <dependency>
        <groupId>com.azure.spring</groupId>
        <artifactId>spring-cloud-azure-starter-active-directory</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-oauth2-resource-server</artifactId>
    </dependency>
</dependencies>

Gerekli özellikleri ekleme

spring:
  cloud:
    azure:
      active-directory:
        enabled: true
        credential:
          client-id: ${AZURE_CLIENT_ID}

Şimdi uygulamanızı başlatın ve uygulamanızın web api'lerine erişin.

  1. Erişim belirteci olmadan 401 alırsınız.

  2. Uygulamanıza erişim belirteci ile erişin. Erişim belirtecindeki aşağıdaki talepler doğrulanır:

    • iss: Erişim belirteci Microsoft Entra Id tarafından verilmelidir.

    • nbf: Geçerli saat nbfönce olamaz.

    • exp: Geçerli saat expsonra olamaz.

    • aud: spring.cloud.azure.active-directory.credential.client-id veya spring.cloud.azure.active-directory.credential.app-id-uri yapılandırılmışsa, hedef kitlenin yapılandırılan client-id veya app-id-urieşit olması gerekir. İki özellik yapılandırılmamışsa, bu talep doğrulanmaz.

Erişim belirteci hakkında daha fazla bilgi için bkz.Microsoft kimlik platformu erişim belirteçleri hakkında MS belgeleri .

Gelişmiş kullanımlar

Ek güvenlik yapılandırmaları ekleme
  • Spring Cloud Azure 5.x
  • Spring Cloud Azure 4.x
@Configuration(proxyBeanMethods = false)
@EnableWebSecurity
@EnableMethodSecurity
public class AadOAuth2ResourceServerSecurityConfig {

    /**
     * Add configuration logic as needed.
     */
    @Bean
    public SecurityFilterChain htmlFilterChain(HttpSecurity http) throws Exception {
        // @formatter:off
        http.apply(AadResourceServerHttpSecurityConfigurer.aadResourceServer())
            .and()
            .authorizeHttpRequests()
            .anyRequest().authenticated();
        // @formatter:on
        return http.build();
    }
}
Kapsamlara göre izni doğrulama
  1. Azure'da gerekli kaynakları oluşturun.

  2. Belirli bir yöntemi koruyun.

    class Demo {
        @GetMapping("scope1")
        @ResponseBody
        @PreAuthorize("hasAuthority('SCOPE_Scope1')")
        public String scope1() {
            return "Congratulations, you can access `scope1` endpoint.";
        }
    }
    

Bunu yaptığınızda, erişim /scope1 uç noktası olduğunda erişim belirtecindeki aşağıdaki talepler doğrulanır:

  • scp: Değer Scope1içermelidir.
Uygulama rollerine göre izni doğrulama
  1. Azure'da gerekli kaynakları oluşturun.

    • Uygulamanıza uygulama rolleri ekleme okuyun ve bunlarıbelirteçte alın.

    • Aşağıdaki parametrelerle bir uygulama rolü oluşturun:

      • Görünen ad: AppRole1
      • İzin verilen üye türleri: Kullanıcılar/Gruplar
      • Değer: AppRole1
      • Bu uygulama rolünü etkinleştirmek istiyor musunuz: evet
  2. Belirli bir yöntemi koruyun.

    class Demo {
        @GetMapping("app-role1")
        @ResponseBody
        @PreAuthorize("hasAuthority('APPROLE_AppRole1')")
        public String appRole1() {
            return "Congratulations, you can access `app-role1` endpoint.";
        }
    }
    

Bunu yaptığınızda, erişim /app-role1 uç noktası olduğunda erişim belirtecindeki aşağıdaki talepler doğrulanır:

  • roles: Değer AppRole1içermelidir.
JWT istemci kimlik doğrulamayı kullanma

İstemci kimlik doğrulaması için JSON Web Belirteci (JWT) kullanmak için aşağıdaki adımları kullanın:

  1. Microsoft kimlik platformu uygulama kimlik doğrulama sertifikası kimlik bilgilerinin Sertifikanızı Microsoft kimlik platformuna kaydetme bölümüne bakın.
  2. Azure portalında kayıtlı uygulamaya bir .pem sertifikası yükleyin.
  3. sertifika yolunu ve parolasını yapılandırın. PFX veya . P12 sertifikası.
  4. JWT istemci kimlik doğrulaması aracılığıyla kimlik doğrulaması için istemciye özellik spring.cloud.azure.active-directory.authorization-clients.azure.client-authentication-method=private_key_jwt yapılandırmasını ekleyin.

Aşağıdaki örnek yapılandırma dosyası bir web uygulaması senaryosuna yöneliktir. Sertifika bilgileri genel özelliklerde yapılandırılır.

spring:
  cloud:
    azure:
      credential:
        client-id: ${AZURE_CLIENT_ID}
        client-certificate-path: ${AZURE_CERTIFICATE_PATH}
        client-certificate-password: ${AZURE_CERTIFICATE_PASSWORD}
      profile:
        tenant-id: <tenant>
      active-directory:
        enabled: true
        user-group:
          allowed-group-names: group1,group2
          allowed-group-ids: <group1-id>,<group2-id>
        post-logout-redirect-uri: http://localhost:8080
        authorization-clients:
          azure:
            client-authentication-method: private_key_jwt
          arm:
            client-authentication-method: private_key_jwt
            scopes: https://management.core.windows.net/user_impersonation
          graph:
            client-authentication-method: private_key_jwt
            scopes:
              - https://graph.microsoft.com/User.Read
              - https://graph.microsoft.com/Directory.Read.All
          webapiA:
            client-authentication-method: private_key_jwt
            scopes:
              - ${WEB_API_A_APP_ID_URL}/Obo.WebApiA.ExampleScope
          webapiB:
            client-authentication-method: private_key_jwt
            scopes:
              - ${WEB_API_B_APP_ID_URL}/.default
            authorization-grant-type: client_credentials

Not

tenant-id için izin verilen değerler şunlardır: common, organizations, consumersveya kiracı kimliği. Bu değerler hakkında daha fazla bilgi için, Hata AADSTS50020 - Kimlik sağlayıcısından kullanıcı hesabı kiracımevcut değil bölümünün Yanlış uç nokta (kişisel ve kuruluş hesapları) kullanıldı bölümüne bakın. Tek kiracılı uygulamanızı dönüştürme hakkında bilgi için bkz. Tek kiracılı uygulamayı Microsoft Entra IDüzerinde çok kiracılıya dönüştürme.

Sertifika bilgilerini, bu örnekte gösterildiği gibi active-directory hizmet özelliklerinde de yapılandırabilirsiniz:

spring:
  cloud:
    azure:
      active-directory:
        enabled: true
        credential:
          client-id: ${AZURE_CLIENT_ID}
          client-certificate-path: ${AZURE_CERTIFICATE_PATH}
          client-certificate-password: ${AZURE_CERTIFICATE_PASSWORD}
        profile:
          tenant-id: <tenant>
        user-group:
          allowed-group-names: group1,group2
          allowed-group-ids: <group1-id>,<group2-id>
        post-logout-redirect-uri: http://localhost:8080
        authorization-clients:
          azure:
            client-authentication-method: private_key_jwt
          arm:
            client-authentication-method: private_key_jwt
            scopes: https://management.core.windows.net/user_impersonation
          graph:
            client-authentication-method: private_key_jwt
            scopes:
              - https://graph.microsoft.com/User.Read
              - https://graph.microsoft.com/Directory.Read.All
          webapiA:
            client-authentication-method: private_key_jwt
            scopes:
              - ${WEB_API_A_APP_ID_URL}/Obo.WebApiA.ExampleScope
          webapiB:
            client-authentication-method: private_key_jwt
            scopes:
              - ${WEB_API_B_APP_ID_URL}/.default
            authorization-grant-type: client_credentials

Not

tenant-id için izin verilen değerler şunlardır: common, organizations, consumersveya kiracı kimliği. Bu değerler hakkında daha fazla bilgi için, Hata AADSTS50020 - Kimlik sağlayıcısından kullanıcı hesabı kiracımevcut değil bölümünün Yanlış uç nokta (kişisel ve kuruluş hesapları) kullanıldı bölümüne bakın. Tek kiracılı uygulamanızı dönüştürme hakkında bilgi için bkz. Tek kiracılı uygulamayı Microsoft Entra IDüzerinde çok kiracılıya dönüştürme.

Ara sunucu aracılığıyla Microsoft Entra Id'ye bağlanma

Microsoft Entra Id'yi ara sunucu aracılığıyla bağlamak için bir RestTemplateCustomizer çekirdeği sağlayın. Daha fazla bilgi için ara sunucu aracılığıyla Microsoft Entra Id'ye bağlanma bölümüne bakın.

Örnekleri

Örnek proje: aad-resource-server.

Diğer kaynak sunucularını ziyaret eden kaynak sunucusu

Sistem Diyagramı

Diğer kaynak sunucularını ziyaret eden bir kaynak sunucusu için Sistem diyagramını .

Azure'da gerekli kaynakları oluşturma

  1. Hızlı Başlangıç: Bir uygulamayıMicrosoft kimlik platformuna kaydetme makalesini okuyun.

  2. Uygulama kaydı oluşturun. AZURE_TENANT_IDalın, AZURE_CLIENT_IDve AZURE_CLIENT_SECRET.

Gerekli bağımlılıkları ekleme

<dependencies>
    <dependency>
        <groupId>com.azure.spring</groupId>
        <artifactId>spring-cloud-azure-starter-active-directory</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-oauth2-resource-server</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-oauth2-client</artifactId>
    </dependency>
</dependencies>

Gerekli özellikleri ekleme

spring:
  cloud:
    azure:
      active-directory:
        enabled: true
        profile:
          tenant-id: <tenant>
        credential:
          client-id: ${AZURE_CLIENT_ID}
          client-secret: ${AZURE_CLIENT_SECRET}
        authorization-clients:
          graph:
            scopes:
              - https://graph.microsoft.com/User.Read

Not

tenant-id için izin verilen değerler şunlardır: common, organizations, consumersveya kiracı kimliği. Bu değerler hakkında daha fazla bilgi için, Hata AADSTS50020 - Kimlik sağlayıcısından kullanıcı hesabı kiracımevcut değil bölümünün Yanlış uç nokta (kişisel ve kuruluş hesapları) kullanıldı bölümüne bakın. Tek kiracılı uygulamanızı dönüştürme hakkında bilgi için bkz. Tek kiracılı uygulamayı Microsoft Entra IDüzerinde çok kiracılıya dönüştürme.

Uygulamanızda OAuth2AuthorizedClient kullanma

public class SampleController {
    @GetMapping("call-graph")
    public String callGraph(@RegisteredOAuth2AuthorizedClient("graph") OAuth2AuthorizedClient graph) {
        return callMicrosoftGraphMeEndpoint(graph);
    }
}

Örnekleri

Örnek proje: aad-resource-server-obo.

Bir uygulamada web uygulaması ve kaynak sunucusu

Azure'da gerekli kaynakları oluşturma

  1. Hızlı Başlangıç: Bir uygulamayıMicrosoft kimlik platformuna kaydetme makalesini okuyun.

  2. Uygulama kaydı oluşturun. AZURE_TENANT_IDalın, AZURE_CLIENT_IDve AZURE_CLIENT_SECRET.

Gerekli bağımlılıkları ekleme

<dependencies>
    <dependency>
        <groupId>com.azure.spring</groupId>
        <artifactId>spring-cloud-azure-starter-active-directory</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-oauth2-resource-server</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-oauth2-client</artifactId>
    </dependency>
</dependencies>

Gerekli özellikleri ekleme

özellik spring.cloud.azure.active-directory.application-typeweb_application_and_resource_serverolarak ayarlayın ve her yetkilendirme istemcisi için yetkilendirme türünü belirtin.

spring:
  cloud:
    azure:
      active-directory:
        enabled: true
        profile:
          tenant-id: <tenant>
        credential:
          client-id: ${AZURE_CLIENT_ID}
          client-secret: ${AZURE_CLIENT_SECRET}
        app-id-uri: ${WEB_API_ID_URI}
        application-type: web_application_and_resource_server  # This is required.
        authorization-clients:
          graph:
            authorizationGrantType: authorization_code # This is required.
            scopes:
              - https://graph.microsoft.com/User.Read
              - https://graph.microsoft.com/Directory.Read.All

Not

tenant-id için izin verilen değerler şunlardır: common, organizations, consumersveya kiracı kimliği. Bu değerler hakkında daha fazla bilgi için, Hata AADSTS50020 - Kimlik sağlayıcısından kullanıcı hesabı kiracımevcut değil bölümünün Yanlış uç nokta (kişisel ve kuruluş hesapları) kullanıldı bölümüne bakın. Tek kiracılı uygulamanızı dönüştürme hakkında bilgi için bkz. Tek kiracılı uygulamayı Microsoft Entra IDüzerinde çok kiracılıya dönüştürme.

SecurityFilterChain Tanımlama

Birden çok SecurityFilterChain örneği yapılandırın. AadWebApplicationAndResourceServerConfig kaynak sunucusu ve web uygulaması için iki güvenlik filtresi zinciri yapılandırması içerir.

  • Spring Cloud Azure 5.x
  • Spring Cloud Azure 4.x
@Configuration(proxyBeanMethods = false)
@EnableWebSecurity
@EnableMethodSecurity
public class AadWebApplicationAndResourceServerConfig {

    @Bean
    @Order(1)
    public SecurityFilterChain apiFilterChain(HttpSecurity http) throws Exception {
        http.apply(AadResourceServerHttpSecurityConfigurer.aadResourceServer())
                .and()
            // All the paths that match `/api/**`(configurable) work as the resource server. Other paths work as the web application.
            .securityMatcher("/api/**")
            .authorizeHttpRequests()
                .anyRequest().authenticated();
        return http.build();
    }

    @Bean
    public SecurityFilterChain htmlFilterChain(HttpSecurity http) throws Exception {
        // @formatter:off
        http.apply(AadWebApplicationHttpSecurityConfigurer.aadWebApplication())
                .and()
            .authorizeHttpRequests()
                .requestMatchers("/login").permitAll()
                .anyRequest().authenticated();
        // @formatter:on
        return http.build();
    }
}

Konfigürasyon

spring-cloud-azure-starter-active-directory'nin yapılandırılabilir özellikleri:

Ad Açıklama
spring.cloud.azure.active-directory.app-id-uri Bir id_token "aud" talebinde kullanılabilecek Uygulama Kimliği URI'si.
spring.cloud.azure.active-directory.application-type Microsoft Entra uygulamasının türü.
spring.cloud.azure.active-directory.authenticate-additional-parameters Yetkilendirme URL'sine ek parametreler ekleyin.
spring.cloud.azure.active-directory.authorization-clients OAuth2 yetkilendirme istemcileri.
spring.cloud.azure.active-directory.credential.client-id Azure ile hizmet sorumlusu kimlik doğrulaması gerçekleştirirken kullanılacak istemci kimliği.
spring.cloud.azure.active-directory.credential.client-secret Azure ile hizmet sorumlusu kimlik doğrulaması gerçekleştirirken kullanılacak istemci gizli dizisi.
spring.cloud.azure.active-directory.jwk-set-cache-lifespan Önbelleğe alınan JWK kümesinin süresi dolmadan önce ayarlanmış olan varsayılan süre 5 dakikadır.
spring.cloud.azure.active-directory.jwk-set-cache-refresh-time Önbelleğe alınan JWK'nin süresi dolmadan önce ayarlanan yenileme süresi varsayılan olarak 5 dakikadır.
spring.cloud.azure.active-directory.jwt-connect-timeout JWKSet Uzak URL çağrısı için Bağlantı Zaman Aşımı.
spring.cloud.azure.active-directory.jwt-read-timeout JWKSet Uzak URL çağrısı için Okuma Zaman Aşımı.
spring.cloud.azure.active-directory.jwt-size-limit JWKSet Uzak URL çağrısının Bayt cinsinden boyut sınırı.
spring.cloud.azure.active-directory.post-logout-redirect-uri Oturumu kapatıldıktan sonra yeniden yönlendirme uri'sini seçin.
spring.cloud.azure.active-directory.profile.cloud-type Bağlanacak Azure bulutunun adı. Desteklenen türler şunlardır: AZURE, AZURE_CHINA, AZURE_GERMANY, AZURE_US_GOVERNMENT, OTHER.
spring.cloud.azure.active-directory.profile.environment Microsoft Entra uç noktalarının özellikleri.
spring.cloud.azure.active-directory.profile.tenant-id Azure Kiracı Kimliği. tenant-id için izin verilen değerler şunlardır: common, organizations, consumersveya kiracı kimliği.
spring.cloud.azure.active-directory.redirect-uri-template Yeniden Yönlendirme Uç Noktası: Yetkilendirme kimlik bilgilerini içeren yanıtları kaynak sahibi kullanıcı aracısı aracılığıyla istemciye döndürmek için yetkilendirme sunucusu tarafından kullanılır. Varsayılan değer {baseUrl}/login/oauth2/code/.
spring.cloud.azure.active-directory.resource-server.claim-to-authority-prefix-map GrantedAuthority oluşturmak için hangi talebin kullanılacağını ve GrantedAuthority'nin dize değerinin ön ekini yapılandırın. Varsayılan değer: "scp" -> "SCOPE_", "roller" -> "APPROLE_".
spring.cloud.azure.active-directory.resource-server.principal-claim-name AuthenticatedPrincipal#getName içinde erişim belirtecindeki hangi talebin döndürüleceklerini yapılandırın. Varsayılan değer "sub" değeridir.
spring.cloud.azure.active-directory.session-stateless True ise durum bilgisi olmayan kimlik doğrulaması filtresi AadAppRoleStatelessAuthenticationFilter'ı etkinleştirir. Varsayılan değer, AadAuthenticationFilter'ı etkinleştiren false değeridir.
spring.cloud.azure.active-directory.user-group.allowed-group-ids Grup kimlikleri, GrantedAuthority oluşturmak için kullanılabilir.
spring.cloud.azure.active-directory.user-group.allowed-group-names Grup adları, GrantedAuthority oluşturmak için kullanılabilir.
spring.cloud.azure.active-directory.user-group.use-transitive-members "True" ise, üyeleri almak için "v1.0/me/transitiveMemberOf" kullanın. Aksi takdirde, "v1.0/me/memberOf" kullanın. Varsayılan değer false.
spring.cloud.azure.active-directory.user-name-attribute Sorumlu adı olarak hangi talebin alınacağına karar verin.

Bu özelliklerin nasıl kullanılacağına ilişkin bazı örnekler aşağıda verilmiştir:

Uygulama türü

Uygulama türü bağımlılıklardan çıkarılabilir: spring-security-oauth2-client veya spring-security-oauth2-resource-server. Çıkarsanan değer istediğiniz değer değilse, uygulama türünü belirtebilirsiniz. Geçerli değerlerin ve çıkarım yapılan değerlerin tablosu aşağıdadır:

spring-cloud-azure-starter-active-directoryuygulama türü:

Bağımlılığı var: spring-security-oauth2-client Bağımlılığı var: spring-security-oauth2-resource-server Uygulama türünün geçerli değerleri Çıkarsanan değer
Evet Hayır web_application web_application
Hayır Evet resource_server resource_server
Evet Evet web_application, resource_server, resource_server_with_obo, web_application_and_resource_server resource_server_with_obo

Azure Active Directory B2C ile Spring Security

Azure Active Directory (Azure AD) B2C, müşterilerinizin uygulamalarınızı kullanırken nasıl kaydolduğunu, oturum açmasını ve profillerini yönetmesini özelleştirmenize ve denetlemenize olanak tanıyan bir kimlik yönetimi hizmetidir. Azure AD B2C bu eylemleri etkinleştirirken müşterilerinizin kimliklerini de aynı anda korur.

Bağımlılık kurulumu

<dependencies>
    <dependency>
        <groupId>com.azure.spring</groupId>
        <artifactId>spring-cloud-azure-starter-active-directory-b2c</artifactId>
    </dependency>
</dependencies>

Konfigürasyon

spring-cloud-azure-starter-active-directory-b2c'nin yapılandırılabilir özellikleri:

Ad Açıklama
spring.cloud.azure.active-directory.b2c.app-id-uri Bir belirtecin "aud" talebinde kullanılabilecek Uygulama Kimliği URI'si.
spring.cloud.azure.active-directory.b2c.authenticate-additional-parameters Kimlik doğrulaması için ek parametreler.
spring.cloud.azure.active-directory.b2c.authorization-clients İstemci yapılandırmasını belirtin.
spring.cloud.azure.active-directory.b2c.base-uri Azure AD B2C uç nokta temel uri'si.
spring.cloud.azure.active-directory.b2c.credential Azure AD B2C kimlik bilgileri.
spring.cloud.azure.active-directory.b2c.jwt-connect-timeout JWKSet Uzak URL çağrısı için Bağlantı Zaman Aşımı.
spring.cloud.azure.active-directory.b2c.jwt-read-timeout JWKSet Uzak URL çağrısı için Okuma Zaman Aşımı.
spring.cloud.azure.active-directory.b2c.jwt-size-limit JWKSet Uzak URL çağrısının Bayt cinsinden boyut sınırı.
spring.cloud.azure.active-directory.b2c.login-flow Birincil oturum açma akış anahtarını belirtin. Varsayılan değer sign-up-or-sign-in.
spring.cloud.azure.active-directory.b2c.logout-success-url Oturumu kapatıldıktan sonra URL'yi yeniden yönlendirin. Varsayılan değer http://localhost:8080/login.
spring.cloud.azure.active-directory.b2c.profile Azure AD B2C profil bilgileri.
spring.cloud.azure.active-directory.b2c.reply-url Yetkilendirme kodunu aldıktan sonra yanıt URL'si. Varsayılan değer {baseUrl}/login/oauth2/code/.
spring.cloud.azure.active-directory.b2c.user-flows Kullanıcı akışları.
spring.cloud.azure.active-directory.b2c.user-name-attribute-name Kullanıcı adı öznitelik adı.

Tam yapılandırmalar için spring cloud azure yapılandırma özelliklerinidenetleyin.

Temel kullanım

web uygulaması, kullanıcının Microsoft Entra Id ile oturum açmasına olanak tanıyan herhangi bir web tabanlı uygulamadır, ancak bir kaynak sunucusu Microsoft Entra Id'den alınan access_token doğruladıktan sonra erişimi kabul eder veya reddeder. Bu kılavuzda 4 senaryo ele alınacağız:

  1. Bir web uygulamasına erişme.

  2. Kaynak sunucularına erişen web uygulaması.

  3. Kaynak sunucusuna erişme.

  4. Diğer kaynak sunucularına erişen kaynak sunucusu.

Kullanım 1: Web uygulamasına erişme

Bu senaryoda, Azure AD B2C kullanıcınızla bir kullanıcıda oturum açmak için OAuth 2.0 yetkilendirme kodu akışı kullanılır.

Portal menüsünden Azure AD B2C seçin, Uygulamalar'ı seçin ve ardındanEkle'yi seçin.

Uygulamanızı Ad (gibi) belirtin, Yanıt URL'siiçin ekleyin, olarak Uygulama Kimliği kaydedin veKaydet'i seçin.

Uygulamanızdan Anahtarlar seçin, oluşturmak için Anahtar oluştur'seçin ve ardındanKaydet'i seçin.

Solunuzda Kullanıcı akışları've ardından Yeni kullanıcı akışı'ni seçin.

Kaydol'u seçin veya, profil düzenlemeve kullanıcı akışları oluşturmak için Parola sıfırlama . Kullanıcı akışınızı ad ve Kullanıcı öznitelikleri ve talepleribelirtin, ardından Oluşturöğesini seçin.

API izinlerini seçinMicrosoft API'leriizin ekle'yi seçin, Microsoft Graphseçin, temsilci izinleriseçin, offline_access seçin ve openid izinlerini ve ardından işlemi tamamlamak için İzin ekle'yi seçin.

Graph izinleri için yönetici onayı verin.

Bir uygulamanın API izinleri ekranını gösteren ve grafik izinleri vurgulanmış Azure portalı ekran görüntüsü.

pom.xml dosyanıza aşağıdaki bağımlılıkları ekleyin.

  • Spring Cloud Azure 5.x
  • Spring Cloud Azure 4.x
<dependencies>
   <dependency>
       <groupId>com.azure.spring</groupId>
       <artifactId>azure-spring-boot-starter-active-directory-b2c</artifactId>
   </dependency>
   <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-web</artifactId>
   </dependency>
   <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-thymeleaf</artifactId>
   </dependency>
   <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-security</artifactId>
   </dependency>
   <dependency>
       <groupId>org.thymeleaf.extras</groupId>
       <artifactId>thymeleaf-extras-springsecurity6</artifactId>
   </dependency>
</dependencies>

Aşağıdaki örnekte gösterildiği gibi, daha önce oluşturduğunuz değerleri kullanarak application.yml dosyanıza özellikler ekleyin:

spring:
 cloud:
   azure:
     active-directory:
       b2c:
         enabled: true
         authenticate-additional-parameters:
           domain_hint: xxxxxxxxx         # optional
           login_hint: xxxxxxxxx          # optional
           prompt: [login,none,consent]   # optional
         base-uri: ${BASE_URI}
         credential:
           client-id: ${WEBAPP_AZURE_CLIENT_ID}
           client-secret: ${WEBAPP_AZURE_CLIENT_SECRET}
         login-flow: ${LOGIN_USER_FLOW_KEY}               # default to sign-up-or-sign-in, will look up the user-flows map with provided key.
         logout-success-url: ${LOGOUT_SUCCESS_URL}
         user-flows:
           ${YOUR_USER_FLOW_KEY}: ${USER_FLOW_NAME}
         user-name-attribute-name: ${USER_NAME_ATTRIBUTE_NAME}

Java kodunuzu yazın.

Denetleyici kodunuz için aşağıdaki örne başvurabilirsiniz:

@Controller
public class WebController {

   private void initializeModel(Model model, OAuth2AuthenticationToken token) {
       if (token != null) {
           final OAuth2User user = token.getPrincipal();
           model.addAllAttributes(user.getAttributes());
           model.addAttribute("grant_type", user.getAuthorities());
           model.addAttribute("name", user.getName());
       }
   }

   @GetMapping(value = { "/", "/home" })
   public String index(Model model, OAuth2AuthenticationToken token) {
       initializeModel(model, token);
       return "home";
   }
}

Güvenlik yapılandırma kodunuz için aşağıdaki örne başvurabilirsiniz:

  • Spring Cloud Azure 5.x
  • Spring Cloud Azure 4.x
@Configuration(proxyBeanMethods = false)
@EnableWebSecurity
public class WebSecurityConfiguration {

    private final AadB2cOidcLoginConfigurer configurer;

    public WebSecurityConfiguration(AadB2cOidcLoginConfigurer configurer) {
        this.configurer = configurer;
    }

    @Bean
    SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        // @formatter:off
        http.authorizeHttpRequests()
                .anyRequest().authenticated()
                .and()
            .apply(configurer);
        // @formatter:on
        return http.build();
    }
}

aad-b2c-web-application örnekhome.html kopyalayın ve PROFILE_EDIT_USER_FLOW ve PASSWORD_RESET_USER_FLOW daha önce kullandığınız kullanıcı akışı adlarınızla değiştirin.

Uygulamanızı derleyin ve test edin. Webapp 8080bağlantı noktasında çalışmasına izin verin.

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önlendirilmelisiniz.

Oturum açma kullanıcı akışını 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 örnek home page görmeniz gerekir.

Kullanım 2: Kaynak sunucularına erişen web uygulaması

Bu senaryo, bir uygulamanın diğer kaynaklara erişmesine izin vermek için web uygulamasına erişim senaryosunu temel alır. Bu senaryo OAuth 2.0 istemci kimlik bilgileri akışı verir.

Portal menüsünden Azure AD B2C seçin, Uygulamalar'ı seçin ve ardındanEkle'yi seçin.

Uygulamanızın Ad (gibi) belirtin, Uygulama Kimliği olarak kaydedin ve Kaydetseçin.

Uygulamanızdan Anahtarlar seçin, oluşturmak için Anahtar oluştur'seçin ve ardındanKaydet'i seçin.

Gezinti bölmesinden API kullanıma sunma'yı seçin ve ardından Ayarla'yı seçin. kaydedin ve WEB_API_A_APP_ID_URL'ı seçin.

Gezinti bölmesinde bildirim seçin ve ardından aşağıdaki JSON kesimini diziye yapıştırın. Uygulama Kimliği URI'siniWEB_API_A_APP_ID_URLolarak kaydedin, uygulama rolünün değerini WEB_API_A_ROLE_VALUEolarak kaydedin ve Kaydet'i seçin.

{
 "allowedMemberTypes": [
   "Application"
 ],
 "description": "WebApiA.SampleScope",
 "displayName": "WebApiA.SampleScope",
 "id": "04989db0-3efe-4db6-b716-ae378517d2b7",
 "isEnabled": true,
 "value": "WebApiA.SampleScope"
}

API izinlerini seçinAPI'lerimizin ekle'yi seçin, WebApiA uygulama adını seçin, Uygulama İzinleriseçin, WebApiA.SampleScope izni 'i seçin ve ardından işlemi tamamlamak için İzin ekle'yi seçin.

WebApiA izinleri için yönetici onayı verin.

Uygulama API'si izinleri ekranını gösteren Azure portalı ekran görüntüsü .

Web uygulamasına erişim senaryosuna temelinde aşağıdaki bağımlılığı ekleyin.

<dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-webflux</artifactId>
</dependency>

Bir web uygulamasına erişim senaryosuna temelinde aşağıdaki yapılandırmayı ekleyin.

spring:
 cloud:
   azure:
     active-directory:
       b2c:
         enabled: true
         base-uri: ${BASE_URI}             # Such as: https://xxxxb2c.b2clogin.com
         profile:
           tenant-id: <tenant>
         authorization-clients:
           ${RESOURCE_SERVER_A_NAME}:
             authorization-grant-type: client_credentials
             scopes: ${WEB_API_A_APP_ID_URL}/.default

Not

tenant-id için izin verilen değerler şunlardır: common, organizations, consumersveya kiracı kimliği. Bu değerler hakkında daha fazla bilgi için, Hata AADSTS50020 - Kimlik sağlayıcısından kullanıcı hesabı kiracımevcut değil bölümünün Yanlış uç nokta (kişisel ve kuruluş hesapları) kullanıldı bölümüne bakın. Tek kiracılı uygulamanızı dönüştürme hakkında bilgi için bkz. Tek kiracılı uygulamayı Microsoft Entra IDüzerinde çok kiracılıya dönüştürme.

Webapp Java kodunuzu yazın.

Denetleyici kodunuz için aşağıdaki örne başvurabilirsiniz:

class Demo {
   /**
    * Access to protected data from Webapp to WebApiA through client credential flow. The access token is obtained by webclient, or
    * <p>@RegisteredOAuth2AuthorizedClient("webApiA")</p>. In the end, these two approaches will be executed to
    * DefaultOAuth2AuthorizedClientManager#authorize method, get the access token.
    *
    * @return Respond to protected data from WebApi A.
    */
   @GetMapping("/webapp/webApiA")
   public String callWebApiA() {
       String body = webClient
           .get()
           .uri(LOCAL_WEB_API_A_SAMPLE_ENDPOINT)
           .attributes(clientRegistrationId("webApiA"))
           .retrieve()
           .bodyToMono(String.class)
           .block();
       LOGGER.info("Call callWebApiA(), request '/webApiA/sample' returned: {}", body);
       return "Request '/webApiA/sample'(WebApi A) returned a " + (body != null ? "success." : "failure.");
   }
}

Güvenlik yapılandırma kodu, Web uygulamasına erişim senaryosundakiyle aynıdır. Aşağıdaki gibi başka bir fasulye webClient ekleyin:

public class SampleConfiguration {
   @Bean
   public WebClient webClient(OAuth2AuthorizedClientManager oAuth2AuthorizedClientManager) {
       ServletOAuth2AuthorizedClientExchangeFilterFunction function =
           new ServletOAuth2AuthorizedClientExchangeFilterFunction(oAuth2AuthorizedClientManager);
       return WebClient.builder()
                       .apply(function.oauth2Configuration())
                       .build();
   }
}

WebApiA Java kodunuzu yazmak için Kaynak sunucusuna erişme bölümüne bakın.

Uygulamanızı derleyin ve test edin. Webapp ve WebApiA sırasıyla bağlantı noktası 8080 ve 8081 üzerinde çalışmasına izin verin. Webapp ve WebApiA uygulamalarını başlatın. Başarıyla oturum açtıktan sonra giriş sayfasına dönün. Daha sonra http://localhost:8080/webapp/webApiA kaynak yanıtını almak için WebApiA erişebilirsiniz.

Kullanım 3: Kaynak sunucusuna erişme

Bu senaryo oturum açmayı desteklemez. Yalnızca erişim belirtecini doğrulayarak sunucuyu koruyun ve geçerliyse isteğe hizmet eder.

WebApiA izninizi oluşturmak için bkz. Kullanım 2: Kaynak Sunucularına Erişen Web Uygulaması.

WebApiA izni ekleyin ve web uygulamanız için yönetici onayı verin.

pom.xml dosyanıza aşağıdaki bağımlılıkları ekleyin.

<dependencies>
   <dependency>
       <groupId>com.azure.spring</groupId>
       <artifactId>azure-spring-boot-starter-active-directory-b2c</artifactId>
   </dependency>
   <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-web</artifactId>
   </dependency>
</dependencies>

Aşağıdaki yapılandırmayı ekleyin.

spring:
 cloud:
   azure:
     active-directory:
       b2c:
         enabled: true
         base-uri: ${BASE_URI}             # Such as: https://xxxxb2c.b2clogin.com
         profile:
           tenant-id: <tenant>
         app-id-uri: ${APP_ID_URI}         # If you're using v1.0 token, configure app-id-uri for `aud` verification
         credential:
           client-id: ${AZURE_CLIENT_ID}           # If you're using v2.0 token, configure client-id for `aud` verification
         user-flows:
           sign-up-or-sign-in: ${SIGN_UP_OR_SIGN_IN_USER_FLOW_NAME}

Not

tenant-id için izin verilen değerler şunlardır: common, organizations, consumersveya kiracı kimliği. Bu değerler hakkında daha fazla bilgi için, Hata AADSTS50020 - Kimlik sağlayıcısından kullanıcı hesabı kiracımevcut değil bölümünün Yanlış uç nokta (kişisel ve kuruluş hesapları) kullanıldı bölümüne bakın. Tek kiracılı uygulamanızı dönüştürme hakkında bilgi için bkz. Tek kiracılı uygulamayı Microsoft Entra IDüzerinde çok kiracılıya dönüştürme.

Java kodunuzu yazın.

Denetleyici kodunuz için aşağıdaki örne başvurabilirsiniz:

class Demo {
   /**
    * webApiA resource api for web app
    * @return test content
    */
   @PreAuthorize("hasAuthority('APPROLE_WebApiA.SampleScope')")
   @GetMapping("/webApiA/sample")
   public String webApiASample() {
       LOGGER.info("Call webApiASample()");
       return "Request '/webApiA/sample'(WebApi A) returned successfully.";
   }
}

Güvenlik yapılandırma kodunuz için aşağıdaki örne başvurabilirsiniz:

  • Spring Cloud Azure 5.x
  • Spring Cloud Azure 4.x
@Configuration(proxyBeanMethods = false)
@EnableWebSecurity
@EnableMethodSecurity
public class ResourceServerConfiguration {
    
    @Bean
    public SecurityFilterChain htmlFilterChain(HttpSecurity http) throws Exception {
        JwtAuthenticationConverter authenticationConverter = new JwtAuthenticationConverter();
        JwtGrantedAuthoritiesConverter jwtGrantedAuthoritiesConverter = new JwtGrantedAuthoritiesConverter();
        jwtGrantedAuthoritiesConverter.setAuthorityPrefix("APPROLE_");
        authenticationConverter.setJwtGrantedAuthoritiesConverter(jwtGrantedAuthoritiesConverter);
        // @formatter:off
        http.authorizeHttpRequests((requests) -> requests.anyRequest().authenticated())
            .oauth2ResourceServer()
            .jwt()
            .jwtAuthenticationConverter(authenticationConverter);
        // @formatter:on
        return http.build();
    }
}

Uygulamanızı derleyin ve test edin. WebApiA 8081bağlantı noktasında çalışmasına izin verin. webApiA kaynağı için erişim belirtecini alın ve taşıyıcı yetkilendirme üst bilgisi olarak http://localhost:8081/webApiA/sample erişin.

Kullanım 4: Diğer kaynak sunucularına erişen kaynak sunucusu

Bu senaryo, bir kaynak sunucusuna erişme yükseltmesi ve OAuth2 istemci kimlik bilgileri akışı temelinde diğer uygulama kaynaklarına erişimi destekler.

Önceki adımlara başvurarak bir WebApiB uygulaması oluşturur ve WebApiB.SampleScopeuygulama iznini kullanıma sunarız.

{
   "allowedMemberTypes": [
       "Application"
   ],
   "description": "WebApiB.SampleScope",
   "displayName": "WebApiB.SampleScope",
   "id": "04989db0-3efe-4db6-b716-ae378517d2b7",
   "isEnabled": true,
   "lang": null,
   "origin": "Application",
   "value": "WebApiB.SampleScope"
}

WebApiB izinleri için yönetici onayı verin.

Uygulama WebApiA API'si izinleri ekranını gösteren Azure portalı ekran görüntüsü .

bir kaynak sunucusuna erişme temelinde, pom.xml dosyanıza aşağıdaki bağımlılığı ekleyin.

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>

Kaynak sunucusuna erişme senaryo yapılandırması temelinde aşağıdaki yapılandırmayı ekleyin.

spring:
 cloud:
   azure:
     active-directory:
       b2c:
         enabled: true
         credential:
           client-secret: ${WEB_API_A_AZURE_CLIENT_SECRET}
         authorization-clients:
           ${RESOURCE_SERVER_B_NAME}:
             authorization-grant-type: client_credentials
             scopes: ${WEB_API_B_APP_ID_URL}/.default

Java kodunuzu yazın.

WebApiA denetleyici kodunuz için aşağıdaki örne başvurabilirsiniz:

public class SampleController {
   /**
    * Access to protected data from WebApiA to WebApiB through client credential flow. The access token is obtained by webclient, or
    * <p>@RegisteredOAuth2AuthorizedClient("webApiA")</p>. In the end, these two approaches will be executed to
    * DefaultOAuth2AuthorizedClientManager#authorize method, get the access token.
    *
    * @return Respond to protected data from WebApi B.
    */
   @GetMapping("/webApiA/webApiB/sample")
   @PreAuthorize("hasAuthority('APPROLE_WebApiA.SampleScope')")
   public String callWebApiB() {
       String body = webClient
           .get()
           .uri(LOCAL_WEB_API_B_SAMPLE_ENDPOINT)
           .attributes(clientRegistrationId("webApiB"))
           .retrieve()
           .bodyToMono(String.class)
           .block();
       LOGGER.info("Call callWebApiB(), request '/webApiB/sample' returned: {}", body);
       return "Request 'webApiA/webApiB/sample'(WebApi A) returned a " + (body != null ? "success." : "failure.");
   }
}

WebApiB denetleyici kodunuz için aşağıdaki örne başvurabilirsiniz:

public class SampleController {
   /**
    * webApiB resource api for other web application
    * @return test content
    */
   @PreAuthorize("hasAuthority('APPROLE_WebApiB.SampleScope')")
   @GetMapping("/webApiB/sample")
   public String webApiBSample() {
       LOGGER.info("Call webApiBSample()");
       return "Request '/webApiB/sample'(WebApi B) returned successfully.";
   }
}

Güvenlik yapılandırma kodu, Kaynak sunucusuna erişme senaryosunda aynıdır; başka bir fasulye webClient aşağıdaki gibi eklenir

public class SampleConfiguration {
   @Bean
   public WebClient webClient(OAuth2AuthorizedClientManager oAuth2AuthorizedClientManager) {
       ServletOAuth2AuthorizedClientExchangeFilterFunction function =
           new ServletOAuth2AuthorizedClientExchangeFilterFunction(oAuth2AuthorizedClientManager);
       return WebClient.builder()
                       .apply(function.oauth2Configuration())
                       .build();
   }
}

Uygulamanızı derleyin ve test edin. WebApiA ve WebApiB sırasıyla bağlantı noktası 8081 ve 8082 üzerinde çalışmasına izin verin. WebApiA ve WebApiB uygulamalarını başlatın, webApiA kaynağın erişim belirtecini alın ve Taşıyıcı yetkilendirme üst bilgisi olarak http://localhost:8081/webApiA/webApiB/sample erişin.

Örnekleri

Daha fazla bilgi içinspring-cloud-azure-starter-active-directory-b2c örneklerine bakın.