Spring Cloud-ondersteuning voor Azure voor Spring Security

Dit artikel is van toepassing op: ✔️ versie 4.14.0 ✔️ versie 5.8.0

In dit artikel wordt beschreven hoe Spring Cloud Azure en Spring Security samen kunnen worden gebruikt.

Spring Security met Microsoft Entra-id

Wanneer u een webtoepassing bouwt, zijn identiteits- en toegangsbeheer altijd fundamentele onderdelen.

Azure biedt een geweldig platform om uw toepassingsontwikkelingstraject te democratiseren, omdat het niet alleen een cloudidentiteitsservice biedt, maar ook een diepgaande integratie met de rest van het Azure-ecosysteem.

Spring Security heeft het eenvoudig gemaakt om uw Spring-toepassingen te beveiligen met krachtige abstracties en uitbreidbare interfaces. Maar net zo krachtig als het Spring-framework kan zijn, is het niet afgestemd op een specifieke id-provider.

De spring-cloud-azure-starter-active-directory biedt de meest optimale manier om uw webtoepassing te verbinden met een Microsoft Entra ID -tenant (Microsoft Entra ID voor korte tijd) en uw resourceserver te beveiligen met Microsoft Entra ID. Het maakt gebruik van het Oauth 2.0-protocol om webtoepassingen en bronservers te beveiligen.

Toegang tot een webtoepassing

In dit scenario wordt de OAuth 2.0-autorisatiecodestroom gebruikt om u aan te melden bij een gebruiker met een Microsoft-account.

Systeemdiagram

System diagram for a standalone web application.

Vereiste resources maken in Azure

  1. Lees quickstart: Een toepassing registreren bij het Microsoft Identity Platform.

  2. Maak een app-registratie. Haal AZURE_TENANT_ID, AZURE_CLIENT_IDen AZURE_CLIENT_SECRET.

  3. Stel in redirect URI op APPLICATION_BASE_URI/login/oauth2/code/ - bijvoorbeeld http://localhost:8080/login/oauth2/code/. De staart / is vereist.

Vereiste afhankelijkheden toevoegen

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

Vereiste eigenschappen toevoegen

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

Notitie

De toegestane tenant-id waarden zijn: common, organizations, consumersof de tenant-id. Zie voor meer informatie over deze waarden het verkeerde eindpunt (persoonlijke en organisatieaccounts) van Fout AADSTS50020 - Gebruikersaccount van id-provider bestaat niet in de tenant. Zie De app met één tenant converteren naar meerdere tenants in Microsoft Entra ID voor meer informatie over het converteren van uw app met één tenant.

Start nu uw toepassing en open uw toepassing via de browser. U wordt omgeleid naar de aanmeldingspagina van Microsoft.

Geavanceerd gebruik

Extra beveiligingsconfiguraties toevoegen
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class AadOAuth2LoginSecurityConfig extends AadWebSecurityConfigurerAdapter {

    /**
     * Add configuration logic as needed.
     */
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        super.configure(http);
        http.authorizeRequests()
                .anyRequest().authenticated();
        // Do some custom configuration
    }
}
Toegang autoriseren door app-rollen

Vereiste resources maken in Azure:

Notitie

Als u op rollen gebaseerd toegangsbeheer voor apps wilt gebruiken, kunt u geen groepsnamen in de role claim plaatsen. Zie de sectie Optionele claims configureren van groepen van optionele claims opgeven voor uw app voor meer informatie.

Beveilig de specifieke methode.

class Demo {
   @GetMapping("Admin")
   @ResponseBody
   @PreAuthorize("hasAuthority('APPROLE_Admin')")
   public String admin() {
       return "Admin message";
   }
}
Toegang autoriseren op groepsnaam of groeps-id

Gerelateerde configuratie-eigenschappen toevoegen.

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

Beveilig de specifieke methode.

@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";
   }
}
National Azure gebruiken in plaats van Global Azure

Met uitzondering van de globale Azure-cloud wordt Microsoft Entra ID geïmplementeerd in de volgende nationale clouds:

  • Azure Government

  • Azure China 21Vianet

  • Azure Duitsland

Hier volgt een voorbeeld met behulp van Azure China 21Vianet.

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

Zie Nationale cloudimplementaties voor meer informatie.

Omleidings-URI-sjabloon configureren

Ontwikkelaars kunnen de omleidings-URI aanpassen.

System diagram for redirect URIs.

Voeg eigenschappen toe redirect-uri-template aan het bestand application.yml .

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

Update redirect-uri in Azure Portal.

Configure Redirect URI Template.

Nadat we hebben ingesteld redirect-uri-template, moeten we de beveiligingsbouwer bijwerken:

@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class AadOAuth2LoginSecurityConfig extends AadWebSecurityConfigurerAdapter {
    /**
     * Add configuration logic as needed.
     */
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        super.configure(http);
        http.oauth2Login()
                .loginProcessingUrl("${REDIRECT-URI-TEMPLATE}")
                .and()
            .authorizeRequests()
                .anyRequest().authenticated();
    }
}

Verbinding maken naar Microsoft Entra-id via proxy

Als u microsoft Entra-id via proxy wilt verbinden, geeft u een RestTemplateCustomizer bean op zoals in het volgende voorbeeld:

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

Voorbeelden

Voorbeeldproject: aad-web-application.

Webtoepassing die toegang heeft tot resourceservers

Systeemdiagram

System diagram for a web application accessing resource servers.

Vereiste resources maken in Azure

  1. Lees quickstart: Een toepassing registreren bij het Microsoft Identity Platform.

  2. Maak een app-registratie. Haal AZURE_TENANT_ID, AZURE_CLIENT_IDen AZURE_CLIENT_SECRET.

  3. Stel redirect URI in op APPLICATION_BASE_URI/login/oauth2/code/, bijvoorbeeld http://localhost:8080/login/oauth2/code/. De staart / is vereist.

Vereiste afhankelijkheden toevoegen

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

Vereiste eigenschappen toevoegen

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

Notitie

De toegestane tenant-id waarden zijn: common, organizations, consumersof de tenant-id. Zie voor meer informatie over deze waarden het verkeerde eindpunt (persoonlijke en organisatieaccounts) van Fout AADSTS50020 - Gebruikersaccount van id-provider bestaat niet in de tenant. Zie De app met één tenant converteren naar meerdere tenants in Microsoft Entra ID voor meer informatie over het converteren van uw app met één tenant.

graph Hier is de naam vanOAuth2AuthorizedClient, scopes betekent dit de bereiken die nodig zijn om toestemming te geven bij het aanmelden.

OAuth2AuthorizedClient gebruiken in uw toepassing

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

Start nu uw toepassing en open uw toepassing in de browser. Vervolgens wordt u omgeleid naar de aanmeldingspagina van Microsoft.

Geavanceerd gebruik

Clientreferentiestroom

De standaardstroom is de autorisatiecodestroom, als u de stroom voor clientreferenties wilt gebruiken, kunt u als volgt configureren:

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

Notitie

De toegestane tenant-id waarden zijn: common, organizations, consumersof de tenant-id. Zie voor meer informatie over deze waarden het verkeerde eindpunt (persoonlijke en organisatieaccounts) van Fout AADSTS50020 - Gebruikersaccount van id-provider bestaat niet in de tenant. Zie De app met één tenant converteren naar meerdere tenants in Microsoft Entra ID voor meer informatie over het converteren van uw app met één tenant.

Toegang tot meerdere resourceservers

In één webtoepassing hebt u toegang tot meerdere resourceservers door als volgt te configureren:

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

Notitie

De toegestane tenant-id waarden zijn: common, organizations, consumersof de tenant-id. Zie voor meer informatie over deze waarden het verkeerde eindpunt (persoonlijke en organisatieaccounts) van Fout AADSTS50020 - Gebruikersaccount van id-provider bestaat niet in de tenant. Zie De app met één tenant converteren naar meerdere tenants in Microsoft Entra ID voor meer informatie over het converteren van uw app met één tenant.

Vervolgens kunt u deze gebruiken OAuth2AuthorizedClient in een toepassing zoals deze

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

Voorbeelden

Voorbeeldproject: aad-web-application.

Toegang tot een resourceserver

Dit scenario biedt geen ondersteuning voor aanmelding. Beveilig de server alleen door het toegangstoken te valideren. Als het toegangstoken geldig is, dient de server de aanvraag.

Systeemdiagram

System diagram for standalone resource server usage.

Vereiste resources maken in Azure

  1. Lees quickstart: Een toepassing registreren bij het Microsoft Identity Platform.

  2. Maak een app-registratie. Haal AZURE_CLIENT_ID.

  3. Lees snelstart: Een toepassing configureren om een web-API beschikbaar te maken.

  4. Een web-API beschikbaar maken met een bereik met de naam Scope-1.

Vereiste afhankelijkheden toevoegen

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

Vereiste eigenschappen toevoegen

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

Start nu uw toepassing en open de web-API van uw toepassing.

  1. U krijgt 401 zonder toegangstoken.

  2. Toegang tot uw toepassing met een toegangstoken. De volgende claims in het toegangstoken worden gevalideerd:

    • iss: Het toegangstoken moet worden uitgegeven door Microsoft Entra ID.

    • nbf: De huidige tijd kan niet eerder nbfzijn.

    • exp: De huidige tijd kan niet na exp.

    • aud: Indien spring.cloud.azure.active-directory.credential.client-id of spring.cloud.azure.active-directory.credential.app-id-uri geconfigureerd, moet de doelgroep gelijk zijn aan de geconfigureerde client-id of app-id-uri. Als de twee eigenschappen niet zijn geconfigureerd, wordt deze claim niet gevalideerd.

Zie MS-documenten over toegangstokens voor Microsoft Identity Platform voor meer informatie over het toegangstoken.

Geavanceerd gebruik

Extra beveiligingsconfiguraties toevoegen
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class AadOAuth2ResourceServerSecurityConfig extends AadResourceServerWebSecurityConfigurerAdapter {
    /**
     * Add configuration logic as needed.
     */
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        super.configure(http);
        http.authorizeRequests((requests) -> requests.anyRequest().authenticated());
    }
}
Machtiging valideren op bereik
  1. Maak vereiste resources in Azure.

  2. Beveilig de specifieke methode.

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

Als dit het toegangseindpunt /scope1 is, worden de volgende claims in het toegangstoken gevalideerd:

  • scp: de waarde moet bevatten Scope1.
Machtiging valideren per app-rollen
  1. Maak vereiste resources in Azure.

  2. Beveilig de specifieke methode.

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

Als dit het toegangseindpunt /app-role1 is, worden de volgende claims in het toegangstoken gevalideerd:

  • roles: de waarde moet bevatten AppRole1.
JWT-clientverificatie gebruiken

Als u een JSON-webtoken (JWT) wilt gebruiken voor clientverificatie, gebruikt u de volgende stappen:

  1. Zie de sectie Uw certificaat registreren bij Het Microsoft Identity Platform van referenties voor verificatiecertificaten voor microsoft-identiteitsplatformtoepassingen.
  2. Upload een PEM-certificaat naar de toepassing die is geregistreerd in Azure Portal.
  3. Configureer het certificaatpad en wachtwoord van een . PFX of . P12-certificaat .
  4. Voeg de eigenschapsconfiguratie spring.cloud.azure.active-directory.authorization-clients.azure.client-authentication-method=private_key_jwt toe aan de client die moet worden geverifieerd via JWT-clientverificatie.

Het volgende voorbeeldconfiguratiebestand is bedoeld voor een webtoepassingsscenario. De certificaatgegevens worden geconfigureerd in de globale eigenschappen.

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

Notitie

De toegestane tenant-id waarden zijn: common, organizations, consumersof de tenant-id. Zie voor meer informatie over deze waarden het verkeerde eindpunt (persoonlijke en organisatieaccounts) van Fout AADSTS50020 - Gebruikersaccount van id-provider bestaat niet in de tenant. Zie De app met één tenant converteren naar meerdere tenants in Microsoft Entra ID voor meer informatie over het converteren van uw app met één tenant.

U kunt ook de certificaatgegevens in de active-directory service-eigenschappen configureren, zoals in dit voorbeeld wordt weergegeven:

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

Notitie

De toegestane tenant-id waarden zijn: common, organizations, consumersof de tenant-id. Zie voor meer informatie over deze waarden het verkeerde eindpunt (persoonlijke en organisatieaccounts) van Fout AADSTS50020 - Gebruikersaccount van id-provider bestaat niet in de tenant. Zie De app met één tenant converteren naar meerdere tenants in Microsoft Entra ID voor meer informatie over het converteren van uw app met één tenant.

Verbinding maken naar Microsoft Entra-id via proxy

Als u Microsoft Entra-id via proxy wilt verbinden, geeft u een RestTemplateCustomizer bean op. Zie de Verbinding maken ing to Microsoft Entra ID via de proxysectie voor meer informatie.

Voorbeelden

Voorbeeldproject: aad-resource-server.

Resourceserver die andere resourceservers bezoekt

Systeemdiagram

System diagram for a resource server visiting other resource servers.

Vereiste resources maken in Azure

  1. Lees quickstart: Een toepassing registreren bij het Microsoft Identity Platform.

  2. Maak een app-registratie. Haal AZURE_TENANT_ID, AZURE_CLIENT_IDen AZURE_CLIENT_SECRET.

Vereiste afhankelijkheden toevoegen

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

Vereiste eigenschappen toevoegen

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

Notitie

De toegestane tenant-id waarden zijn: common, organizations, consumersof de tenant-id. Zie voor meer informatie over deze waarden het verkeerde eindpunt (persoonlijke en organisatieaccounts) van Fout AADSTS50020 - Gebruikersaccount van id-provider bestaat niet in de tenant. Zie De app met één tenant converteren naar meerdere tenants in Microsoft Entra ID voor meer informatie over het converteren van uw app met één tenant.

OAuth2AuthorizedClient gebruiken in uw toepassing

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

Voorbeelden

Voorbeeldproject: aad-resource-server-obo.

Webtoepassing en resourceserver in één toepassing

Vereiste resources maken in Azure

  1. Lees quickstart: Een toepassing registreren bij het Microsoft Identity Platform.

  2. Maak een app-registratie. Haal AZURE_TENANT_ID, AZURE_CLIENT_IDen AZURE_CLIENT_SECRET.

Vereiste afhankelijkheden toevoegen

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

Vereiste eigenschappen toevoegen

Stel de eigenschap in spring.cloud.azure.active-directory.application-type op web_application_and_resource_serveren geef het autorisatietype op voor elke autorisatieclient.

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

Notitie

De toegestane tenant-id waarden zijn: common, organizations, consumersof de tenant-id. Zie voor meer informatie over deze waarden het verkeerde eindpunt (persoonlijke en organisatieaccounts) van Fout AADSTS50020 - Gebruikersaccount van id-provider bestaat niet in de tenant. Zie De app met één tenant converteren naar meerdere tenants in Microsoft Entra ID voor meer informatie over het converteren van uw app met één tenant.

SecurityFilterChain definiëren

Configureer meerdere SecurityFilterChain exemplaren. AadWebApplicationAndResourceServerConfig bevat twee configuraties voor beveiligingsfilterketens voor resourceserver en webtoepassing.

@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class AadWebApplicationAndResourceServerConfig {

    @Order(1)
    @Configuration
    public static class ApiWebSecurityConfigurationAdapter extends AadResourceServerWebSecurityConfigurerAdapter {
        protected void configure(HttpSecurity http) throws Exception {
            super.configure(http);
            // All the paths that match `/api/**`(configurable) work as `Resource Server`, other paths work as `Web application`.
            http.antMatcher("/api/**")
                .authorizeRequests().anyRequest().authenticated();
        }
    }

    @Configuration
    public static class HtmlWebSecurityConfigurerAdapter extends AadWebSecurityConfigurerAdapter {

        @Override
        protected void configure(HttpSecurity http) throws Exception {
            super.configure(http);
            // @formatter:off
            http.authorizeRequests()
                    .antMatchers("/login").permitAll()
                    .anyRequest().authenticated();
            // @formatter:on
        }
    }
}

Configuratie

Configureerbare eigenschappen van spring-cloud-azure-starter-active-directory:

Name Beschrijving
spring.cloud.azure.active-directory.app-id-uri App-id-URI die kan worden gebruikt in de claim 'aud' van een id_token.
spring.cloud.azure.active-directory.application-type Type van de Microsoft Entra-toepassing.
spring.cloud.azure.active-directory.authenticate-additional-parameters Voeg extra parameters toe aan de autorisatie-URL.
spring.cloud.azure.active-directory.authorization-clients De OAuth2-autorisatieclients.
spring.cloud.azure.active-directory.credential.client-id Client-id die moet worden gebruikt bij het uitvoeren van service-principalverificatie met Azure.
spring.cloud.azure.active-directory.credential.client-secret Clientgeheim dat moet worden gebruikt bij het uitvoeren van service-principal-verificatie met Azure.
spring.cloud.azure.active-directory.jwk-set-cache-levensduur De levensduur van de in de cache opgeslagen JWK die is ingesteld voordat deze verloopt, is standaard 5 minuten.
spring.cloud.azure.active-directory.jwk-set-cache-refresh-time De vernieuwingstijd van de in de cache opgeslagen JWK die is ingesteld voordat deze verloopt, is standaard 5 minuten.
spring.cloud.azure.active-directory.jwt-connect-timeout Verbinding maken ion time-out voor de externe URL-aanroep van JWKSet.
spring.cloud.azure.active-directory.jwt-read-timeout Time-out lezen voor de externe JWKSet-URL-aanroep.
spring.cloud.azure.active-directory.jwt-size-limit Groottelimiet in bytes van de externe JWKSet-URL-aanroep.
spring.cloud.azure.active-directory.post-logout-redirect-uri De omleidings-URI na afmelding.
spring.cloud.azure.active-directory.profile.cloud-type Naam van de Azure-cloud waarmee verbinding moet worden gemaakt. Ondersteunde typen zijn: AZURE, AZURE_CHINA, AZURE_GERMANY, AZURE_US_GOVERNMENT, OTHER.
spring.cloud.azure.active-directory.profile.environment Eigenschappen voor Microsoft Entra-eindpunten.
spring.cloud.azure.active-directory.profile.tenant-id Azure-tenant-id. De toegestane tenant-id waarden zijn: common, organizations, consumersof de tenant-id.
spring.cloud.azure.active-directory.redirect-uri-template Omleidingseindpunt: wordt gebruikt door de autorisatieserver om antwoorden met autorisatiereferenties naar de client te retourneren via de gebruikersagent van de resource-eigenaar. De standaardwaarde is {baseUrl}/login/oauth2/code/.
spring.cloud.azure.active-directory.resource-server.claim-to-authority-prefix-map Configureer welke claim wordt gebruikt voor het bouwen van GrantedAuthority en het voorvoegsel van de tekenreekswaarde van GrantedAuthority. De standaardwaarde is: 'scp' -> 'SCOPE_', 'rollen' -> 'APPROLE_'.
spring.cloud.azure.active-directory.resource-server.principal-claim-name Configureer welke claim in toegangstoken moet worden geretourneerd in AuthenticatedPrincipal#getName. De standaardwaarde is 'sub'.
spring.cloud.azure.active-directory.session-stateless Als waar is, wordt het staatloze verificatiefilter AadAppRoleStatelessAuthenticationFilter geactiveerd. De standaardwaarde is onwaar waarmee AadAuthenticationFilter wordt geactiveerd.
spring.cloud.azure.active-directory.user-group.allowed-group-ids De groeps-id's kunnen worden gebruikt om GrantedAuthority samen te stellen.
spring.cloud.azure.active-directory.user-group.allowed-group-names De groepsnamen kunnen worden gebruikt om GrantedAuthority samen te stellen.
spring.cloud.azure.active-directory.user-group.use-transitive-members Als 'true', gebruikt u 'v1.0/me/transitiveMemberOf' om leden op te halen. Gebruik anders 'v1.0/me/memberOf'. De standaardwaarde is false.
spring.cloud.azure.active-directory.user-name-attribute Bepaal welke claim de naam van de principal moet zijn.

Hier volgen enkele voorbeelden van het gebruik van deze eigenschappen:

Toepassingstype

Het toepassingstype kan worden afgeleid van de afhankelijkheden: spring-security-oauth2-client of spring-security-oauth2-resource-server. Als de uitgestelde waarde niet de gewenste waarde is, kunt u het toepassingstype opgeven. Hier volgt de tabel met geldige waarden en uitgestelde waarden:

Toepassingstype van spring-cloud-azure-starter-active-directory:

Heeft afhankelijkheid: spring-security-oauth2-client Heeft afhankelijkheid: spring-security-oauth2-resource-server Geldige waarden van het toepassingstype Uitgestelde waarde
Ja No web_application web_application
No Ja resource_server resource_server
Ja Ja web_application, resource_server, resource_server_with_obo, web_application_and_resource_server resource_server_with_obo

Spring Security met Azure Active Directory B2C

Azure Active Directory (Azure AD) B2C is een identiteitsbeheerservice waarmee u kunt aanpassen en controleren hoe uw klanten zich registreren en aanmelden en hoe zijn hun profielen beheren wanneer ze uw toepassingen gebruiken. Met Azure AD B2C kunt u deze acties uitvoeren terwijl u tegelijkertijd de identiteit van uw klant beschermt.

Afhankelijkheid instellen

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

Configuratie

Configureerbare eigenschappen van spring-cloud-azure-starter-active-directory-b2c:

Name Beschrijving
spring.cloud.azure.active-directory.b2c.app-id-uri App-id-URI die kan worden gebruikt in de claim aud van een token.
spring.cloud.azure.active-directory.b2c.authenticate-additional-parameters Aanvullende parameters voor verificatie.
spring.cloud.azure.active-directory.b2c.authorization-clients Geef de clientconfiguratie op.
spring.cloud.azure.active-directory.b2c.base-uri Basis-URI van Azure AD B2C-eindpunt.
spring.cloud.azure.active-directory.b2c.credential Azure AD B2C-referentiegegevens.
spring.cloud.azure.active-directory.b2c.jwt-connect-timeout Verbinding maken ion time-out voor de externe URL-aanroep van JWKSet.
spring.cloud.azure.active-directory.b2c.jwt-read-timeout Time-out lezen voor de externe JWKSet-URL-aanroep.
spring.cloud.azure.active-directory.b2c.jwt-size-limit Groottelimiet in bytes van de externe JWKSet-URL-aanroep.
spring.cloud.azure.active-directory.b2c.login-flow Geef de primaire aanmeldingsstroomsleutel op. De standaardwaarde is sign-up-or-sign-in.
spring.cloud.azure.active-directory.b2c.logout-success-url Omleidings-URL na afmelding. De standaardwaarde is http://localhost:8080/login.
spring.cloud.azure.active-directory.b2c.profile Azure AD B2C-profielgegevens.
spring.cloud.azure.active-directory.b2c.reply-url Antwoord-URL na het ophalen van autorisatiecode. De standaardwaarde is {baseUrl}/login/oauth2/code/.
spring.cloud.azure.active-directory.b2c.user-flows Gebruikersstromen.
spring.cloud.azure.active-directory.b2c.user-name-attribute-name-name Kenmerknaam van gebruikersnaam.

Raadpleeg de configuratie-eigenschappen van Spring Cloud Azure voor volledige configuraties.

Basaal gebruik

Een webtoepassing is een webtoepassing waarmee de gebruiker zich kan aanmelden met Microsoft Entra-id, terwijl een resourceserver na het valideren van access_token verkregen van Microsoft Entra ID toegang accepteert of weigert. In deze handleiding worden vier scenario's behandeld:

  1. Toegang tot een webtoepassing.

  2. Webtoepassing die toegang heeft tot resourceservers.

  3. Toegang tot een resourceserver.

  4. Resourceserver die toegang heeft tot andere resourceservers.

System diagram of web application interaction with Microsoft Entra ID and resource servers.

Gebruik 1: Toegang tot een webtoepassing

In dit scenario wordt de OAuth 2.0-autorisatiecodestroom gebruikt om u aan te melden bij een gebruiker met uw Azure AD B2C-gebruiker.

Selecteer Azure AD B2C in het portalmenu, selecteer Toepassingen en selecteer vervolgens Toevoegen.

Geef de naam van uw toepassing op (bijvoorbeeld webapp), voeg deze toe http://localhost:8080/login/oauth2/code/ voor de antwoord-URL, noteer de toepassings-id als uw WEB_APP_AZURE_CLIENT_IDen selecteer Opslaan.

Selecteer Sleutels in uw toepassing, selecteer Sleutel genereren om te genereren WEB_APP_AZURE_CLIENT_SECRETen selecteer vervolgens Opslaan.

Selecteer Gebruikersstromen aan de linkerkant en selecteer vervolgens Nieuwe gebruikersstroom.

Kies Registreren of in, Profiel bewerken en Wachtwoord opnieuw instellen om respectievelijk gebruikersstromen te maken. Geef uw gebruikersstroomnaam en gebruikerskenmerken en -claims op en selecteer Vervolgens Maken.

Selecteer API-machtigingen>Toevoegen een machtiging>Microsoft API's, selecteer Microsoft Graph, selecteer Gedelegeerde machtigingen, selecteer de offline_access en openid-machtigingen en selecteer vervolgens Machtiging toevoegen om het proces te voltooien.

Beheerderstoestemming verlenen voor Graph-machtigingen.

Azure portal screenshot showing API permissions screen for an app, with graph permissions highlighted.

Voeg de volgende afhankelijkheden toe aan uw pom.xml-bestand .

<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-springsecurity5</artifactId>
   </dependency>
</dependencies>

Voeg eigenschappen toe aan uw bestand application.yml met behulp van de waarden die u eerder hebt gemaakt, zoals wordt weergegeven in het volgende voorbeeld:

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}

Schrijf uw Java-code.

Voor de controllercode kunt u het volgende voorbeeld raadplegen:

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

Raadpleeg het volgende voorbeeld voor uw beveiligingsconfiguratiecode:

@EnableWebSecurity
public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter {

   private final AadB2cOidcLoginConfigurer configurer;

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

   @Override
   protected void configure(HttpSecurity http) throws Exception {
       // @formatter:off
       http.authorizeRequests()
               .anyRequest().authenticated()
               .and()
           .apply(configurer);
       // @formatter:off
   }
}

Kopieer de home.html uit het voorbeeld van aad-b2c-web-application en vervang de en PASSWORD_RESET_USER_FLOW door de PROFILE_EDIT_USER_FLOW namen van uw gebruikersstroom die u eerder hebt gebruikt.

Bouw en test uw app. Laten we Webapp uitvoeren op poort 8080.

Nadat uw toepassing is gebouwd en gestart door Maven, opent u http://localhost:8080/ deze in een webbrowser. U wordt omgeleid naar de aanmeldingspagina.

Selecteer de koppeling met de aanmeldingsgebruikersstroom. U moet Azure AD B2C omleiden om het verificatieproces te starten.

Nadat u bent aangemeld, ziet u het voorbeeld home page in de browser.

Gebruik 2: Webtoepassing die toegang heeft tot resourceservers

Dit scenario is gebaseerd op het scenario voor het openen van een webtoepassing om een toepassing toegang te geven tot andere resources. Dit scenario is de stroom voor het verlenen van OAuth 2.0-clientreferenties.

Selecteer Azure AD B2C in het portalmenu, selecteer Toepassingen en selecteer vervolgens Toevoegen.

Geef uw toepassingsnaam (zoals webApiA), noteer de toepassings-id als uw WEB_API_A_AZURE_CLIENT_IDen selecteer Opslaan.

Selecteer Sleutels in uw toepassing, selecteer Sleutel genereren om te genereren WEB_API_A_AZURE_CLIENT_SECRETen selecteer vervolgens Opslaan.

Selecteer Een API beschikbaar maken in het navigatiedeelvenster en selecteer Vervolgens Instellen. Noteer de URI van de toepassings-id als uw WEB_API_A_APP_ID_URLen selecteer Opslaan.

Selecteer Manifest in het navigatiedeelvenster en plak het volgende JSON-segment in appRoles matrix. Noteer de URI van de toepassings-id als uwWEB_API_A_APP_ID_URL, noteer de waarde van de app-rol als uw WEB_API_A_ROLE_VALUEen selecteer Opslaan.

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

Azure portal screenshot showing application manifest screen with appRoles JSON highlighted.

Selecteer API-machtigingen>Toevoegen een machtiging>Mijn API's, selecteer de naam van de WebApiA-toepassing, selecteer Toepassingsmachtigingen, selecteer De machtiging WebApiA.SampleScope en selecteer vervolgens Machtiging toevoegen om het proces te voltooien.

Beheerderstoestemming verlenen voor WebApiA-machtigingen.

Azure portal screenshot showing application API permissions screen.

Voeg de volgende afhankelijkheid toe op basis van het scenario voor het openen van een webtoepassing .

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

Voeg de volgende configuratie toe op basis van het scenario voor het openen van een webtoepassing .

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

Notitie

De toegestane tenant-id waarden zijn: common, organizations, consumersof de tenant-id. Zie voor meer informatie over deze waarden het verkeerde eindpunt (persoonlijke en organisatieaccounts) van Fout AADSTS50020 - Gebruikersaccount van id-provider bestaat niet in de tenant. Zie De app met één tenant converteren naar meerdere tenants in Microsoft Entra ID voor meer informatie over het converteren van uw app met één tenant.

Schrijf uw Webapp Java-code.

Voor de controllercode kunt u het volgende voorbeeld raadplegen:

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

De beveiligingsconfiguratiecode is hetzelfde als in het scenario voor het openen van een webtoepassing . Voeg als volgt een andere bean webClient toe:

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

Zie de sectie Toegang tot een resourceserver om uw WebApiA Java-code te schrijven.

Bouw en test uw app. Laat Webapp en WebApiA voer deze uit op respectievelijk poort 8080 en 8081 . Start de Webapp en WebApiA toepassingen. Ga terug naar de startpagina nadat u zich hebt aangemeld. U kunt vervolgens toegang krijgen http://localhost:8080/webapp/webApiA tot het antwoord van de WebApiA resource.

Gebruik 3: Toegang tot een resourceserver

Dit scenario biedt geen ondersteuning voor aanmelding. Beveilig de server door het toegangstoken te valideren en als dit geldig is, wordt de aanvraag verwerkt.

Zie Gebruik 2: Toegang tot resourceservers voor webtoepassingen om uw WebApiA machtiging te maken.

Voeg machtigingen toe WebApiA en ververleent beheerderstoestemming voor uw webtoepassing.

Voeg de volgende afhankelijkheden toe aan uw pom.xml-bestand .

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

Voeg de volgende configuratie toe.

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}

Notitie

De toegestane tenant-id waarden zijn: common, organizations, consumersof de tenant-id. Zie voor meer informatie over deze waarden het verkeerde eindpunt (persoonlijke en organisatieaccounts) van Fout AADSTS50020 - Gebruikersaccount van id-provider bestaat niet in de tenant. Zie De app met één tenant converteren naar meerdere tenants in Microsoft Entra ID voor meer informatie over het converteren van uw app met één tenant.

Schrijf uw Java-code.

Voor de controllercode kunt u het volgende voorbeeld raadplegen:

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

Raadpleeg het volgende voorbeeld voor uw beveiligingsconfiguratiecode:

@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class ResourceServerConfiguration extends WebSecurityConfigurerAdapter {

   @Override
   protected void configure(HttpSecurity http) throws Exception {
       http.authorizeRequests((requests) -> requests.anyRequest().authenticated())
           .oauth2ResourceServer()
           .jwt()
               .jwtAuthenticationConverter(new AadJwtBearerTokenAuthenticationConverter());
   }
}

Bouw en test uw app. Laten we WebApiA uitvoeren op poort 8081. Haal het toegangstoken voor de webApiA resource op en open vervolgens als http://localhost:8081/webApiA/sample de Bearer-autorisatieheader.

Gebruik 4: Resourceserver die toegang heeft tot andere resourceservers

Dit scenario is een upgrade van toegang tot een resourceserver en biedt ondersteuning voor toegang tot andere toepassingsresources, op basis van de OAuth2-clientreferentiestroom.

Als we naar de vorige stappen verwijzen, maken we een WebApiB toepassing en maken we een toepassingsmachtiging WebApiB.SampleScopebeschikbaar.

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

Azure portal screenshot showing application WebApiB manifest screen with appRoles JSON highlighted.

Beheerderstoestemming verlenen voor WebApiB machtigingen.

Azure portal screenshot showing application WebApiA API permissions screen.

Voeg op basis van het openen van een resourceserver de volgende afhankelijkheid toe aan uw pom.xml-bestand .

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

Voeg de volgende configuratie toe op basis van de configuratie van een resourceserverscenario .

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

Schrijf uw Java-code.

Voor de WebApiA controllercode kunt u het volgende voorbeeld raadplegen:

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

Voor de WebApiB controllercode kunt u het volgende voorbeeld raadplegen:

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

Beveiligingsconfiguratiecode is hetzelfde met het openen van een resourceserverscenario . Er wordt als volgt een andere bean webClient toegevoegd

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

Bouw en test uw app. Laat WebApiA en WebApiB voer deze uit op respectievelijk poort 8081 en 8082 . Start de WebApiA en WebApiB toepassingen, haal het toegangstoken voor webApiA de resource op en open het http://localhost:8081/webApiA/webApiB/sample als de Bearer-autorisatieheader.

Voorbeelden

Zie de spring-cloud-azure-starter-active-directory-b2c-voorbeelden voor meer informatie.