Megosztás a következőn keresztül:


Spring Cloud Azure-támogatás a Spring Securityhez

Ez a cikk azt ismerteti, hogyan használható együtt a Spring Cloud Azure és a Spring Security.

Spring Security a Microsoft Entra ID-val

Webalkalmazás létrehozásakor az identitás- és hozzáférés-kezelés mindig alapvető fontosságú lesz.

Az Azure nagyszerű platformot kínál az alkalmazásfejlesztési folyamat demokratizálásához, mivel nem csak felhőalapú identitásszolgáltatást, hanem az Azure többi ökoszisztémájával való mély integrációt is kínál.

A Spring Security megkönnyíti a Spring-alapú alkalmazások hatékony absztrakciókkal és bővíthető felületekkel való védelmét. A Spring-keretrendszer azonban nem egy adott identitásszolgáltatóra van szabva.

A spring-cloud-azure-starter-active-directory biztosítja a webalkalmazás microsoft entra-azonosítójához (röviden Microsoft Entra-azonosítóhoz) való csatlakoztatásának és az erőforrás-kiszolgáló Microsoft Entra-azonosítóval való védelmének legoptimálisabb módját. Az Oauth 2.0 protokollt használja a webalkalmazások és az erőforrás-kiszolgálók védelmére.

Webalkalmazás elérése

Ez a forgatókönyv Az OAuth 2.0 engedélyezési kód folyamatot biztosít egy Microsoft-fiókkal rendelkező felhasználó bejelentkezéséhez.

Rendszerdiagram

különálló webalkalmazás rendszerdiagramja.

Szükséges erőforrások létrehozása az Azure-ban

  1. Olvassa el rövid útmutatót: Alkalmazás regisztrálása a Microsoft identitásplatformon.

  2. Alkalmazásregisztráció létrehozása. AZURE_TENANT_ID, AZURE_CLIENT_IDés AZURE_CLIENT_SECRETlekérése.

  3. Állítsa redirect URIAPPLICATION_BASE_URI/login/oauth2/code/ - például http://localhost:8080/login/oauth2/code/. A / szükséges.

Szükséges függőségek hozzáadása

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

Kötelező tulajdonságok hozzáadása

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

Jegyzet

A tenant-id engedélyezett értékek a következők: common, organizations, consumersvagy bérlőazonosító. Ezekről az értékekről további információt a Helytelen végpont (személyes és szervezeti fiókok) szakaszában talál, hiba AADSTS50020 – Az identitásszolgáltatótól származó felhasználói fiók nem létezik a bérlői. Az egybérlős alkalmazás konvertálásáról további információt Az egybérlős alkalmazás átalakítása több-bérlőssé a Microsoft Entra-azonosító.

Most indítsa el az alkalmazást, és nyissa meg az alkalmazást a böngészőben. A rendszer átirányítja a Microsoft bejelentkezési oldalára.

Speciális használati módok

További biztonsági konfigurációk hozzáadása
@Configuration(proxyBeanMethods = false)
@EnableWebSecurity
@EnableMethodSecurity
public class AadOAuth2LoginSecurityConfig {

   /**
    * Add configuration logic as needed.
    */
   @Bean
   SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
       http.with(AadWebApplicationHttpSecurityConfigurer.aadWebApplication(), Customizer.withDefaults())
           .authorizeHttpRequests(authorize -> authorize.anyRequest().authenticated());
           // Do some custom configuration.
       return http.build();
   }
}
Hozzáférés engedélyezése alkalmazásszerepkörök szerint

Szükséges erőforrások létrehozása az Azure-ban:

Jegyzet

Ha alkalmazásszerepkör-alapú hozzáférés-vezérlést szeretne használni, nem helyezhet csoportneveket a role jogcímbe. További információ: Csoportok konfigurálása választható jogcímekOpcionális jogcímek megadása az alkalmazáscímű szakaszában.

Az adott metódus védelme.

class Demo {
   @GetMapping("Admin")
   @ResponseBody
   @PreAuthorize("hasAuthority('APPROLE_Admin')")
   public String admin() {
       return "Admin message";
   }
}
Hozzáférés engedélyezése csoportnév vagy csoportazonosító alapján

Adjon hozzá kapcsolódó konfigurációs tulajdonságokat.

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

Az adott metódus védelme.

@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";
   }
}
A Nemzeti Azure használata a globális Azure helyett

A globális Azure-felhő kivételével a Microsoft Entra ID a következő nemzeti felhőkben van üzembe helyezve:

  • Azure Government

  • Azure China 21Vianet

  • Azure Németország

Íme egy minta az Azure China 21Vianet használatával.

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

További információ: nemzeti felhőtelepítések.

Átirányítási URI-sablon konfigurálása

A fejlesztők testre szabhatják az átirányítási uri-t.

átirányítási URI-k rendszerdiagramja.

Adjon hozzá redirect-uri-template tulajdonságokat a application.yml fájlhoz.

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

Frissítse redirect-uri az Azure Portalon.

Átirányítási URI-sablon konfigurálása.

A redirect-uri-templatebeállítása után frissíteni kell a biztonsági szerkesztőt:

@Configuration(proxyBeanMethods = false)
@EnableWebSecurity
@EnableMethodSecurity
public class AadOAuth2LoginSecurityConfig {

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

Csatlakozás a Microsoft Entra-azonosítóhoz proxyn keresztül

Ha proxyn keresztül szeretné csatlakoztatni a Microsoft Entra-azonosítót, adjon meg egy RestTemplateCustomizer babot, mint az alábbi példában látható:

@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);
        };
    }
}

Minták

Mintaprojekt: aad-webalkalmazás.

Erőforrás-kiszolgálókhoz hozzáférő webalkalmazás

Rendszerdiagram

rendszerdiagram erőforrás-kiszolgálókat elérő webalkalmazásokhoz.

Szükséges erőforrások létrehozása az Azure-ban

  1. Olvassa el rövid útmutatót: Alkalmazás regisztrálása a Microsoft identitásplatformon.

  2. Alkalmazásregisztráció létrehozása. AZURE_TENANT_ID, AZURE_CLIENT_IDés AZURE_CLIENT_SECRETlekérése.

  3. Állítsa redirect URIAPPLICATION_BASE_URI/login/oauth2/code/, például http://localhost:8080/login/oauth2/code/. A / szükséges.

Szükséges függőségek hozzáadása

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

Kötelező tulajdonságok hozzáadása

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

Jegyzet

A tenant-id engedélyezett értékek a következők: common, organizations, consumersvagy bérlőazonosító. Ezekről az értékekről további információt a Helytelen végpont (személyes és szervezeti fiókok) szakaszában talál, hiba AADSTS50020 – Az identitásszolgáltatótól származó felhasználói fiók nem létezik a bérlői. Az egybérlős alkalmazás konvertálásáról további információt Az egybérlős alkalmazás átalakítása több-bérlőssé a Microsoft Entra-azonosító.

Itt graph a OAuth2AuthorizedClientneve, scopes a bejelentkezéshez szükséges hatóköröket jelenti.

Az OAuth2AuthorizedClient használata az alkalmazásban

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

Most indítsa el az alkalmazást, és nyissa meg az alkalmazást a böngészőben. Ezután a rendszer átirányítja a Microsoft bejelentkezési oldalára.

Speciális használati módok

Ügyfél hitelesítő adatainak folyamata

Az alapértelmezett folyamat engedélyezési kódfolyamat, ha ügyfél hitelesítőadat-folyamatát szeretné használni, az alábbi módon konfigurálhatja:

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

Jegyzet

A tenant-id engedélyezett értékek a következők: common, organizations, consumersvagy bérlőazonosító. Ezekről az értékekről további információt a Helytelen végpont (személyes és szervezeti fiókok) szakaszában talál, hiba AADSTS50020 – Az identitásszolgáltatótól származó felhasználói fiók nem létezik a bérlői. Az egybérlős alkalmazás konvertálásáról további információt Az egybérlős alkalmazás átalakítása több-bérlőssé a Microsoft Entra-azonosító.

Több erőforráskiszolgáló elérése

Egy webalkalmazásban a következőképpen konfigurálva érhet el több erőforráskiszolgálót:

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

Jegyzet

A tenant-id engedélyezett értékek a következők: common, organizations, consumersvagy bérlőazonosító. Ezekről az értékekről további információt a Helytelen végpont (személyes és szervezeti fiókok) szakaszában talál, hiba AADSTS50020 – Az identitásszolgáltatótól származó felhasználói fiók nem létezik a bérlői. Az egybérlős alkalmazás konvertálásáról további információt Az egybérlős alkalmazás átalakítása több-bérlőssé a Microsoft Entra-azonosító.

Ezután használhatja a OAuth2AuthorizedClient az ilyen alkalmazásokban

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

Minták

Mintaprojekt: aad-webalkalmazás.

Erőforrás-kiszolgáló elérése

Ez a forgatókönyv nem támogatja a bejelentkezést, csak a hozzáférési jogkivonat érvényesítésével védi a kiszolgálót. Ha a hozzáférési jogkivonat érvényes, a kiszolgáló kiszolgálja a kérést.

Rendszerdiagram

különálló erőforráskiszolgáló-használat rendszerdiagramja.

Szükséges erőforrások létrehozása az Azure-ban

  1. Olvassa el rövid útmutatót: Alkalmazás regisztrálása a Microsoft identitásplatformon.

  2. Alkalmazásregisztráció létrehozása. AZURE_CLIENT_IDlekérése.

  3. Olvassa el rövid útmutatót: Alkalmazás konfigurálása webes API-való közzétételhez.

  4. Egy Scope-1nevű hatókörrel rendelkező webes API-t tehet közzé.

Szükséges függőségek hozzáadása

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

Kötelező tulajdonságok hozzáadása

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

Most indítsa el az alkalmazást, és nyissa meg az alkalmazás webes API-ját.

  1. A 401-et hozzáférési jogkivonat nélkül fogja megkapni.

  2. Hozzáférés az alkalmazáshoz hozzáférési jogkivonattal. A hozzáférési jogkivonatban a következő jogcímek lesznek érvényesítve:

    • iss: A hozzáférési jogkivonatot a Microsoft Entra ID-nak kell kiállítania.

    • nbf: Az aktuális idő nem lehet nbfelőtt.

    • exp: Az aktuális idő nem lehet expután.

    • aud: Ha spring.cloud.azure.active-directory.credential.client-id vagy spring.cloud.azure.active-directory.credential.app-id-uri konfigurálva van, a célközönségnek meg kell egyezike a konfigurált client-id vagy app-id-uri. Ha a két tulajdonság nincs konfigurálva, a jogcím nem lesz érvényesítve.

A hozzáférési jogkivonattal kapcsolatos további információkért tekintse meg microsoftos identitásplatform hozzáférési jogkivonatairól .

Speciális használati módok

További biztonsági konfigurációk hozzáadása
@Configuration(proxyBeanMethods = false)
@EnableWebSecurity
@EnableMethodSecurity
public class AadOAuth2ResourceServerSecurityConfig {

    /**
     * Add configuration logic as needed.
     */
    @Bean
    public SecurityFilterChain htmlFilterChain(HttpSecurity http) throws Exception {
        // @formatter:off
        http.with(AadResourceServerHttpSecurityConfigurer.aadResourceServer(), Customizer.withDefaults())
            .authorizeHttpRequests(authorize -> authorize.anyRequest().authenticated());
        // @formatter:on
        return http.build();
    }
}
Engedély érvényesítése hatókörök szerint
  1. Hozzon létre szükséges erőforrásokat az Azure-ban.

  2. Az adott metódus védelme.

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

Ezzel /scope1 végpont elérésekor a következő jogcímek lesznek érvényesítve a hozzáférési jogkivonatban:

  • scp: Az értéknek Scope1kell tartalmaznia.
Engedély érvényesítése alkalmazásszerepkörök szerint
  1. Hozzon létre szükséges erőforrásokat az Azure-ban.

  2. Az adott metódus védelme.

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

Ezzel /app-role1 végpont elérésekor a következő jogcímek lesznek érvényesítve a hozzáférési jogkivonatban:

  • roles: Az értéknek AppRole1kell tartalmaznia.
JWT-ügyfélhitelesítés használata

JSON-webjogkivonat (JWT) ügyfél-hitelesítéshez való használatához kövesse az alábbi lépéseket:

  1. Tekintse meg Tanúsítvány regisztrálása a Microsoft identitásplatformonMicrosoft identitásplatform-alkalmazás hitelesítési hitelesítő adatainakcímű szakaszát.
  2. Töltsön fel egy .pem tanúsítványt az Azure Portalon regisztrált alkalmazásba.
  3. Konfigurálja egy tanúsítványútvonalát és jelszavát. PFX vagy . P12 tanúsítvány.
  4. Adja hozzá a JWT-ügyfélhitelesítéssel hitelesítendő spring.cloud.azure.active-directory.authorization-clients.azure.client-authentication-method=private_key_jwt tulajdonságkonfigurációt az ügyfélhez.

Az alábbi példakonfigurációs fájl egy webalkalmazás-forgatókönyvhöz készült. A tanúsítványadatok a globális tulajdonságokban vannak konfigurálva.

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

Jegyzet

A tenant-id engedélyezett értékek a következők: common, organizations, consumersvagy bérlőazonosító. Ezekről az értékekről további információt a Helytelen végpont (személyes és szervezeti fiókok) szakaszában talál, hiba AADSTS50020 – Az identitásszolgáltatótól származó felhasználói fiók nem létezik a bérlői. Az egybérlős alkalmazás konvertálásáról további információt Az egybérlős alkalmazás átalakítása több-bérlőssé a Microsoft Entra-azonosító.

A tanúsítványadatokat a active-directory szolgáltatás tulajdonságaiban is konfigurálhatja, ahogyan az ebben a példában látható:

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

Jegyzet

A tenant-id engedélyezett értékek a következők: common, organizations, consumersvagy bérlőazonosító. Ezekről az értékekről további információt a Helytelen végpont (személyes és szervezeti fiókok) szakaszában talál, hiba AADSTS50020 – Az identitásszolgáltatótól származó felhasználói fiók nem létezik a bérlői. Az egybérlős alkalmazás konvertálásáról további információt Az egybérlős alkalmazás átalakítása több-bérlőssé a Microsoft Entra-azonosító.

Csatlakozás a Microsoft Entra-azonosítóhoz proxyn keresztül

A Microsoft Entra ID proxyn keresztüli csatlakoztatásához adjon meg egy RestTemplateCustomizer babot. További információ: Csatlakozás a Microsoft Entra-azonosítóhoz proxy szakaszon keresztül.

Minták

Mintaprojekt: aad-resource-server.

Más erőforráskiszolgálókra látogató erőforrás-kiszolgáló

Rendszerdiagram

más erőforráskiszolgálókra látogató erőforrás-kiszolgáló rendszerdiagramja.

Szükséges erőforrások létrehozása az Azure-ban

  1. Olvassa el rövid útmutatót: Alkalmazás regisztrálása a Microsoft identitásplatformon.

  2. Alkalmazásregisztráció létrehozása. AZURE_TENANT_ID, AZURE_CLIENT_IDés AZURE_CLIENT_SECRETlekérése.

Szükséges függőségek hozzáadása

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

Kötelező tulajdonságok hozzáadása

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

Jegyzet

A tenant-id engedélyezett értékek a következők: common, organizations, consumersvagy bérlőazonosító. Ezekről az értékekről további információt a Helytelen végpont (személyes és szervezeti fiókok) szakaszában talál, hiba AADSTS50020 – Az identitásszolgáltatótól származó felhasználói fiók nem létezik a bérlői. Az egybérlős alkalmazás konvertálásáról további információt Az egybérlős alkalmazás átalakítása több-bérlőssé a Microsoft Entra-azonosító.

Az OAuth2AuthorizedClient használata az alkalmazásban

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

Minták

Mintaprojekt: aad-resource-server-obo.

Webalkalmazás és erőforrás-kiszolgáló egy alkalmazásban

Szükséges erőforrások létrehozása az Azure-ban

  1. Olvassa el rövid útmutatót: Alkalmazás regisztrálása a Microsoft identitásplatformon.

  2. Alkalmazásregisztráció létrehozása. AZURE_TENANT_ID, AZURE_CLIENT_IDés AZURE_CLIENT_SECRETlekérése.

Szükséges függőségek hozzáadása

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

Kötelező tulajdonságok hozzáadása

Állítsa a spring.cloud.azure.active-directory.application-type tulajdonságot web_application_and_resource_serverértékre, és adja meg az egyes engedélyezési ügyfelek engedélyezési típusát.

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

Jegyzet

A tenant-id engedélyezett értékek a következők: common, organizations, consumersvagy bérlőazonosító. Ezekről az értékekről további információt a Helytelen végpont (személyes és szervezeti fiókok) szakaszában talál, hiba AADSTS50020 – Az identitásszolgáltatótól származó felhasználói fiók nem létezik a bérlői. Az egybérlős alkalmazás konvertálásáról további információt Az egybérlős alkalmazás átalakítása több-bérlőssé a Microsoft Entra-azonosító.

SecurityFilterChain definiálása

Konfiguráljon több SecurityFilterChain példányt. AadWebApplicationAndResourceServerConfig két biztonsági szűrőlánc-konfigurációt tartalmaz az erőforrás-kiszolgálóhoz és a webalkalmazáshoz.

@Configuration(proxyBeanMethods = false)
@EnableWebSecurity
@EnableMethodSecurity
public class AadWebApplicationAndResourceServerConfig {

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

    @Bean
    public SecurityFilterChain htmlFilterChain(HttpSecurity http) throws Exception {
        // @formatter:off
        http.with(AadWebApplicationHttpSecurityConfigurer.aadWebApplication(), Customizer.withDefaults())
            .authorizeHttpRequests(auth -> auth.requestMatchers("/login").permitAll().anyRequest().authenticated());
        // @formatter:on
        return http.build();
    }
}

Konfiguráció

A spring-cloud-azure-starter-active-directory konfigurálható tulajdonságai:

Név Leírás
spring.cloud.azure.active-directory.app-id-uri Egy id_token "aud" jogcímében használható alkalmazásazonosító URI.
spring.cloud.azure.active-directory.application-type A Microsoft Entra alkalmazás típusa.
spring.cloud.azure.active-directory.authenticate-additional-parameters Adjon hozzá további paramétereket az engedélyezési URL-címhez.
spring.cloud.azure.active-directory.authorization-clients Az OAuth2 engedélyezési ügyfelei.
spring.cloud.azure.active-directory.credential.client-id Az Azure-ral végzett egyszerű szolgáltatáshitelesítéshez használandó ügyfél-azonosító.
spring.cloud.azure.active-directory.credential.client-secret Az Azure-ral végzett egyszerű szolgáltatáshitelesítéshez használandó ügyfélkód.
spring.cloud.azure.active-directory.jwk-set-cache-lifespan A gyorsítótárazott JWK-készlet élettartamának lejárata előtt az alapértelmezett érték 5 perc.
spring.cloud.azure.active-directory.jwk-set-cache-refresh-time A gyorsítótárazott JWK-készlet frissítési ideje a lejárat előtt, alapértelmezés szerint 5 perc.
spring.cloud.azure.active-directory.jwt-connect-timeout A JWKSet távoli URL-hívás kapcsolati időtúllépése.
spring.cloud.azure.active-directory.jwt-read-timeout Olvasási időtúllépés a JWKSet távoli URL-hívásához.
spring.cloud.azure.active-directory.jwt-size-limit Méretkorlát a távoli JWKSet URL-hívás bájtjaiban.
spring.cloud.azure.active-directory.post-logout-redirect-uri Az átirányítási uri a kijelentkezés után.
spring.cloud.azure.active-directory.profile.cloud-type A csatlakozni kívánt Azure-felhő neve. Támogatott típusok: AZURE, AZURE_CHINA, AZURE_GERMANY, AZURE_US_GOVERNMENT, EGYÉB.
spring.cloud.azure.active-directory.profile.environment Tulajdonságok a Microsoft Entra-végpontokhoz.
spring.cloud.azure.active-directory.profile.tenant-id Azure-bérlőazonosító. A tenant-id engedélyezett értékek a következők: common, organizations, consumersvagy bérlőazonosító.
spring.cloud.azure.active-directory.redirect-uri-template Átirányítási végpont: Az engedélyezési kiszolgáló az engedélyezési hitelesítő adatokat tartalmazó válaszok visszaadására szolgál az ügyfélnek az erőforrás-tulajdonos felhasználói ügynökön keresztül. Az alapértelmezett érték a {baseUrl}/login/oauth2/code/.
spring.cloud.azure.active-directory.resource-server.claim-to-authority-prefix-map Konfigurálja, hogy melyik jogcímet fogja használni az GrantedAuthority létrehozásához, valamint a GrantedAuthority sztringértékének előtagját. Alapértelmezett érték: "scp" -> "SCOPE_", "szerepkörök" -> "APPROLE_".
spring.cloud.azure.active-directory.resource-server.principal-claim-name Konfigurálja, hogy a hozzáférési jogkivonat melyik jogcímét adja vissza a AuthenticatedPrincipal#getName fájlban. Az alapértelmezett érték az "al".
spring.cloud.azure.active-directory.session-stateless Ha igaz, aktiválja az állapot nélküli hitelesítési szűrőt az AadAppRoleStatelessAuthenticationFilter. Az alapértelmezett érték hamis, amely aktiválja az AadAuthenticationFiltert.
spring.cloud.azure.active-directory.user-group.allowed-group-ids A csoportazonosítók az GrantedAuthority létrehozásához használhatók.
spring.cloud.azure.active-directory.user-group.allowed-group-names A csoportnevek a GrantedAuthority létrehozásához használhatók.
spring.cloud.azure.active-directory.user-group.use-transitive-members Ha "igaz", használja a "v1.0/me/transitiveMemberOf" parancsot a tagok lekéréséhez. Ellenkező esetben használja a "v1.0/me/memberOf" parancsot. Az alapértelmezett érték a false.
spring.cloud.azure.active-directory.user-name-attribútum Döntse el, hogy melyik jogcím legyen a tag neve.

Íme néhány példa a tulajdonságok használatára:

Alkalmazás típusa

Az alkalmazás típusa a függőségekből következtethető ki: spring-security-oauth2-client vagy spring-security-oauth2-resource-server. Ha a kikövetkeztetett érték nem a kívánt érték, megadhatja az alkalmazás típusát. Az alábbi táblázat érvényes értékeket és kikövetkedő értékeket tartalmaz:

A spring-cloud-azure-starter-active-directoryalkalmazástípusa:

Függősége van: spring-security-oauth2-client Függősége van: spring-security-oauth2-resource-server Alkalmazástípus érvényes értékei Halasztott érték
Igen Nem web_application web_application
Nem Igen resource_server resource_server
Igen Igen web_application, resource_server, resource_server_with_oboweb_application_and_resource_server resource_server_with_obo

Spring Security az Azure Active Directory B2C-vel

Az Azure Active Directory (Azure AD) B2C egy identitáskezelési szolgáltatás, amellyel testre szabhatja és szabályozhatja az ügyfelek regisztrációját, bejelentkezését és a profiljaik kezelését az alkalmazások használatakor. Az Azure AD B2C lehetővé teszi ezeket a műveleteket, miközben egyszerre védi az ügyfelek identitásait.

Függőség beállítása

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

Konfiguráció

A spring-cloud-azure-starter-active-directory-b2c konfigurálható tulajdonságai:

Név Leírás
spring.cloud.azure.active-directory.b2c.app-id-uri Egy jogkivonat "aud" jogcímében használható alkalmazásazonosító URI.
spring.cloud.azure.active-directory.b2c.authenticate-additional-parameters További paraméterek a hitelesítéshez.
spring.cloud.azure.active-directory.b2c.authorization-clients Adja meg az ügyfélkonfigurációt.
spring.cloud.azure.active-directory.b2c.base-uri Azure AD B2C-végpont alap uri.
spring.cloud.azure.active-directory.b2c.credential Az Azure AD B2C hitelesítő adatai.
spring.cloud.azure.active-directory.b2c.jwt-connect-timeout A JWKSet távoli URL-hívás kapcsolati időtúllépése.
spring.cloud.azure.active-directory.b2c.jwt-read-timeout Olvasási időtúllépés a JWKSet távoli URL-hívásához.
spring.cloud.azure.active-directory.b2c.jwt-size-limit Méretkorlát a távoli JWKSet URL-hívás bájtjaiban.
spring.cloud.azure.active-directory.b2c.login-flow Adja meg az elsődleges bejelentkezési folyamatkulcsot. Az alapértelmezett érték a sign-up-or-sign-in.
spring.cloud.azure.active-directory.b2c.logout-success-url Url-cím átirányítása kijelentkezés után. Az alapértelmezett érték a http://localhost:8080/login.
spring.cloud.azure.active-directory.b2c.profile Az Azure AD B2C-profil adatai.
spring.cloud.azure.active-directory.b2c.reply-url Válasz URL-cím az engedélyezési kód lekérése után. Az alapértelmezett érték a {baseUrl}/login/oauth2/code/.
spring.cloud.azure.active-directory.b2c.user-flow Felhasználói folyamatok.
spring.cloud.azure.active-directory.b2c.felhasználónév-attribútum-neve Felhasználónév attribútum neve.

A teljes konfigurációkért tekintse meg Spring Cloud Azure konfigurációs tulajdonságait.

Alapszintű használat

A webalkalmazások bármely olyan webalapú alkalmazás, amely lehetővé teszi a felhasználó számára a Microsoft Entra-azonosítóval való bejelentkezést, míg egy erőforrás-kiszolgáló a Microsoft Entra-azonosítóból beszerzett access_token ellenőrzése után fogadja vagy megtagadja a hozzáférést. Ebben az útmutatóban 4 forgatókönyvet mutatunk be:

  1. Webalkalmazás elérése.

  2. Erőforrás-kiszolgálókhoz hozzáférő webalkalmazás.

  3. Erőforrás-kiszolgáló elérése.

  4. Más erőforráskiszolgálókhoz hozzáférő erőforrás-kiszolgáló.

1. használat: Webalkalmazás elérése

Ez a forgatókönyv Az OAuth 2.0 engedélyezési kód folyamatot biztosít egy felhasználó azure AD B2C-felhasználóval való bejelentkezéséhez.

Válassza Azure AD B2C a portál menüjében, válassza Alkalmazások, majd a Hozzáadáslehetőséget.

Adja meg az alkalmazás Név (például webapp), adja hozzá http://localhost:8080/login/oauth2/code/ a Válasz URL-címéhez, rögzítse a alkalmazásazonosítót a WEB_APP_AZURE_CLIENT_ID, majd válassza a Mentéslehetőséget.

Válassza Kulcsok az alkalmazásból, válassza a Kulcs létrehozása WEB_APP_AZURE_CLIENT_SECRETlétrehozásához, majd válassza a Mentéslehetőséget.

Válassza Felhasználói folyamatok lehetőséget a bal oldalon, majd válassza Új felhasználói folyamatlehetőséget.

Válassza a Regisztráció vagy, Profilszerkesztési, valamint a felhasználói folyamatok létrehozásához Jelszóátállítás lehetőséget. Adja meg a felhasználói folyamatot Név és Felhasználói attribútumok és jogcímek, majd válassza a Létrehozáslehetőséget.

Válassza API-engedélyeket>Engedély hozzáadása>Microsoft API-k, válassza Microsoft Graph, válassza Delegált engedélyek, válassza ki a offline_access és openid engedélyeket, majd válassza Engedély hozzáadása a folyamat befejezéséhez.

Adjon rendszergazdai hozzájárulást Graph- engedélyhez.

Azure Portal képernyőképe egy alkalmazás API-engedélyeinek képernyőjével, kiemelt gráfengedélyekkel.

Adja hozzá a következő függőségeket a pom.xml fájlhoz.

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

Tulajdonságok hozzáadása a application.yml fájlhoz a korábban létrehozott értékekkel, ahogyan az alábbi példában látható:

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}

Írja meg a Java-kódot.

A vezérlő kódjához tekintse meg a következő példát:

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

A biztonsági konfigurációs kód esetében tekintse meg a következő példát:

@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(auth -> auth.anyRequest().authenticated())
            .with(configurer, Customizer.withDefaults());
        // @formatter:on
        return http.build();
    }
}

Másolja a home.htmlaad-b2c-web-application minta, és cserélje le a PROFILE_EDIT_USER_FLOW és PASSWORD_RESET_USER_FLOW a korábban használt felhasználói folyamatnevekre.

Készítse el és tesztelje az alkalmazást. Futtassa Webapp porton 8080.

Miután a Maven elkészítette és elindította az alkalmazást, nyissa meg a http://localhost:8080/ egy webböngészőben. A bejelentkezési lapra kell átirányítani.

Válassza ki a bejelentkezési felhasználói folyamatot tartalmazó hivatkozást. A hitelesítési folyamat elindításához átirányítani kell az Azure AD B2C-t.

Miután sikeresen bejelentkezett, látnia kell a böngészőből származó minta home page.

2. használat: Erőforrás-kiszolgálókhoz hozzáférő webalkalmazás

Ez a forgatókönyv a Egy webalkalmazás-forgatókönyvön alapul, amely lehetővé teszi, hogy az alkalmazás más erőforrásokhoz férhessen hozzá. Ez a forgatókönyv Az OAuth 2.0 ügyfél hitelesítő adatai folyamatot biztosítanak.

Válassza Azure AD B2C a portál menüjében, válassza Alkalmazások, majd a Hozzáadáslehetőséget.

Adja meg az alkalmazás név (például webApiA), rögzítse a alkalmazásazonosítót a WEB_API_A_AZURE_CLIENT_ID, majd válassza a Mentéslehetőséget.

Válassza Kulcsok az alkalmazásból, válassza a Kulcs létrehozása WEB_API_A_AZURE_CLIENT_SECRETlétrehozásához, majd válassza a Mentéslehetőséget.

Válassza API- megjelenítése a navigációs panelen, majd válassza beállítása lehetőséget. Jegyezze fel az alkalmazásazonosító URI-WEB_API_A_APP_ID_URL, majd válassza a Mentéslehetőséget.

Válassza Jegyzék a navigációs panelen, majd illessze be a következő JSON-szegmenst appRoles tömbbe. Jegyezze fel az alkalmazásazonosító URI-WEB_API_A_APP_ID_URL, jegyezze fel az alkalmazásszerepkör értékét WEB_API_A_ROLE_VALUE, majd válassza a Mentéslehetőséget.

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

Válassza API-engedélyek>Engedély hozzáadása>Saját API-k, válassza WebApiA alkalmazás nevét, válassza Alkalmazásengedélyeklehetőséget, válassza WebApiA.SampleScope engedélyt, majd válassza a Engedély hozzáadása lehetőséget a folyamat befejezéséhez.

Adjon rendszergazdai hozzájárulást WebApiA engedélyéhez.

Azure Portal képernyőképe, amelyen az alkalmazás API-engedélyeinek képernyője látható.

Adja hozzá a következő függőséget a Webalkalmazás elérése forgatókönyv alapján.

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

Adja hozzá a következő konfigurációt a Webalkalmazás elérése forgatókönyv alapján.

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

Jegyzet

A tenant-id engedélyezett értékek a következők: common, organizations, consumersvagy bérlőazonosító. Ezekről az értékekről további információt a Helytelen végpont (személyes és szervezeti fiókok) szakaszában talál, hiba AADSTS50020 – Az identitásszolgáltatótól származó felhasználói fiók nem létezik a bérlői. Az egybérlős alkalmazás konvertálásáról további információt Az egybérlős alkalmazás átalakítása több-bérlőssé a Microsoft Entra-azonosító.

Írja meg a Webapp Java-kódját.

A vezérlő kódjához tekintse meg a következő példát:

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

A biztonsági konfigurációs kód ugyanaz, mint a Webalkalmazás elérése forgatókönyvben. Adjon hozzá egy másik bab webClient az alábbiak szerint:

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

A WebApiA Java-kód írásához tekintse meg az Erőforrás-kiszolgáló elérése című szakaszt.

Készítse el és tesztelje az alkalmazást. Futtassa Webapp és WebApiA a porton 8080 és 8081. Indítsa el a Webapp és WebApiA alkalmazásokat. A sikeres bejelentkezés után térjen vissza a kezdőlapra. Ezután hozzáférhet http://localhost:8080/webapp/webApiA a WebApiA erőforrás-válasz lekéréséhez.

3. használat: Erőforrás-kiszolgáló elérése

Ez a forgatókönyv nem támogatja a bejelentkezést. Csak védje a kiszolgálót a hozzáférési jogkivonat érvényesítésével, és ha érvényes, akkor az kiszolgálja a kérést.

A WebApiA engedély létrehozásához lásd: 2. használat: Webalkalmazások hozzáférése erőforráskiszolgálókhoz.

Adjon hozzá WebApiA engedélyt, és adjon rendszergazdai hozzájárulást a webalkalmazáshoz.

Adja hozzá a következő függőségeket a pom.xml fájlhoz.

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

Adja hozzá a következő konfigurációt.

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}

Jegyzet

A tenant-id engedélyezett értékek a következők: common, organizations, consumersvagy bérlőazonosító. Ezekről az értékekről további információt a Helytelen végpont (személyes és szervezeti fiókok) szakaszában talál, hiba AADSTS50020 – Az identitásszolgáltatótól származó felhasználói fiók nem létezik a bérlői. Az egybérlős alkalmazás konvertálásáról további információt Az egybérlős alkalmazás átalakítása több-bérlőssé a Microsoft Entra-azonosító.

Írja meg a Java-kódot.

A vezérlő kódjához tekintse meg a következő példát:

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

A biztonsági konfigurációs kód esetében tekintse meg a következő példát:

@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(auth -> auth.anyRequest().authenticated())
            .oauth2ResourceServer(o -> o.jwt(j -> j.jwtAuthenticationConverter(authenticationConverter)));
        // @formatter:on
        return http.build();
    }
}

Készítse el és tesztelje az alkalmazást. Futtassa WebApiA porton 8081. Szerezze be a webApiA erőforrás hozzáférési jogkivonatát, majd lépjen http://localhost:8081/webApiA/sample a Tulajdonos engedélyezési fejléceként.

4. használat: Más erőforráskiszolgálókhoz hozzáférő erőforráskiszolgáló

Ez a forgatókönyv az erőforráskiszolgálóelérése frissítése, és az OAuth2 ügyfél hitelesítő adatainak folyamata alapján támogatja a más alkalmazáserőforrásokhoz való hozzáférést.

Az előző lépésekre hivatkozva létrehozunk egy WebApiB alkalmazást, és közzé teszünk egy alkalmazásengedélyt WebApiB.SampleScope.

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

Adjon rendszergazdai hozzájárulást WebApiB engedélyekhez.

Azure Portal képernyőképe, amelyen az alkalmazás WebApiA API engedélyeinek képernyője látható.

Az erőforráskiszolgálóelérése alapján adja hozzá a következő függőséget a pom.xml fájlhoz.

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

Adja hozzá a következő konfigurációt az erőforrás-kiszolgáló elérése forgatókönyv-konfiguráció alapján.

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

Írja meg a Java-kódot.

A WebApiA vezérlőkódjához tekintse meg a következő példát:

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

A WebApiB vezérlőkódjához tekintse meg a következő példát:

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

A biztonsági konfigurációs kód ugyanaz, Erőforrás-kiszolgáló elérése forgatókönyv, egy másik bab webClient az alábbiak szerint lesz hozzáadva

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

Készítse el és tesztelje az alkalmazást. Futtassa WebApiA és WebApiB a porton 8081 és 8082. Indítsa el a WebApiA és WebApiB alkalmazásokat, szerezze be a hozzáférési jogkivonatot webApiA erőforráshoz, és hozzáférés http://localhost:8081/webApiA/webApiB/sample a Tulajdonos engedélyezési fejléceként.

Minták

További információ: spring-cloud-azure-starter-active-directory-b2c minták.