Spring Security için Spring Cloud Azure desteği

Bu makale şunlar için geçerlidir: ✔️ Sürüm 4.14.0 ✔️ Sürüm 5.8.0

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

Microsoft Entra Id ile Spring Security

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

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

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

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

Web uygulamasına erişme

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

Sistem Diyagramı

System diagram for a standalone web application.

Azure'da gerekli kaynakları oluşturma

  1. Hızlı Başlangıç: Uygulamayı Microsoft kimlik platformu kaydetmeyi okuyun.

  2. Uygulama kaydı oluşturun. , AZURE_CLIENT_IDve AZURE_CLIENT_SECRETalınAZURE_TENANT_ID.

  3. olarak APPLICATION_BASE_URI/login/oauth2/code/ ayarlayınredirect URI- örneğinhttp://localhost:8080/login/oauth2/code/. Kuyruk oluşturma / gereklidir.

Gerekli bağımlılıkları ekleme

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

Gerekli özellikleri ekleme

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

Dekont

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

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

Gelişmiş kullanımlar

Ek güvenlik yapılandırmaları ekleme
@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
    }
}
Uygulama rollerine göre erişimi yetkilendirme

Azure'da gerekli kaynakları oluşturma:

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

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

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

Dekont

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

Belirli bir yöntemi koruyun.

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

İlgili yapılandırma özelliklerini ekleyin.

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

Belirli bir yöntemi koruyun.

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

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

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

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

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

  • Azure Kamu

  • Azure China 21Vianet

  • Azure Almanya

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

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

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

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

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

System diagram for redirect URIs.

application.yml dosyanıza özellikler ekleyinredirect-uri-template.

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

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

Configure Redirect URI Template.

ayarladıktan redirect-uri-templatesonra güvenlik oluşturucusunu güncelleştirmemiz gerekir:

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

Ara sunucu aracılığıyla Microsoft Entra Id'ye Bağlan

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

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

Örnekler

Örnek proje: aad-web-application.

Kaynak sunucularına erişen web uygulaması

Sistem Diyagramı

System diagram for a web application accessing resource servers.

Azure'da Gerekli Kaynakları Oluşturma

  1. Hızlı Başlangıç: Uygulamayı Microsoft kimlik platformu kaydetmeyi okuyun.

  2. Uygulama kaydı oluşturun. , AZURE_CLIENT_IDve AZURE_CLIENT_SECRETalınAZURE_TENANT_ID.

  3. olarak ayarlayınredirect URI, örneğinhttp://localhost:8080/login/oauth2/code/.APPLICATION_BASE_URI/login/oauth2/code/ Kuyruk oluşturma / gereklidir.

Gerekli bağımlılıkları ekleme

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

Gerekli özellikleri ekleme

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

Dekont

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

graph Burada adı OAuth2AuthorizedClientscopes , oturum açarken onay vermek için gereken kapsamlar anlamına gelir.

Uygulamanızda OAuth2AuthorizedClient kullanma

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

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

Gelişmiş kullanımlar

İstemci Kimlik Bilgisi Akışı

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

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

Dekont

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

Birden çok kaynak sunucusuna erişme

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

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

Dekont

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

Daha sonra uygulamada bu şekilde kullanabilirsiniz OAuth2AuthorizedClient

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

Örnekler

Örnek proje: aad-web-application.

Kaynak sunucusuna erişme

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

Sistem Diyagramı

System diagram for standalone resource server usage.

Azure'da gerekli kaynakları oluşturma

  1. Hızlı Başlangıç: Uygulamayı Microsoft kimlik platformu kaydetmeyi okuyun.

  2. Uygulama kaydı oluşturun. alın AZURE_CLIENT_ID.

  3. Hızlı Başlangıç: Web API'sini kullanıma sunan bir uygulama yapılandırmayı okuyun.

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

Gerekli bağımlılıkları ekleme

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

Gerekli özellikleri ekleme

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

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

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

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

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

    • nbf: Geçerli saat öncesinde nbfolamaz.

    • exp: Geçerli saat sonrasında expolamaz.

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

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

Gelişmiş kullanımlar

Ek güvenlik yapılandırmaları ekleme
@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());
    }
}
Kapsamlara göre izni doğrulama
  1. Azure'da gerekli kaynakları oluşturun.

  2. Belirli bir yöntemi koruyun.

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

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

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

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

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

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

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

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

  • roles: Değeri içermelidir AppRole1.
JWT istemci kimlik doğrulamayı kullanma

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

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

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

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

Dekont

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

Bu örnekte gösterildiği gibi hizmet özelliklerinde active-directory sertifika bilgilerini de yapılandırabilirsiniz:

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

Dekont

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

Ara sunucu aracılığıyla Microsoft Entra Id'ye Bağlan

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

Örnekler

Örnek proje: aad-resource-server.

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

Sistem Diyagramı

System diagram for a resource server visiting other resource servers.

Azure'da gerekli kaynakları oluşturma

  1. Hızlı Başlangıç: Uygulamayı Microsoft kimlik platformu kaydetmeyi okuyun.

  2. Uygulama kaydı oluşturun. , AZURE_CLIENT_IDve AZURE_CLIENT_SECRETalınAZURE_TENANT_ID.

Gerekli bağımlılıkları ekleme

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

Gerekli özellikleri ekleme

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

Dekont

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

Uygulamanızda OAuth2AuthorizedClient kullanma

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

Örnekler

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

Bir uygulamada web uygulaması ve kaynak sunucusu

Azure'da gerekli kaynakları oluşturma

  1. Hızlı Başlangıç: Uygulamayı Microsoft kimlik platformu kaydetmeyi okuyun.

  2. Uygulama kaydı oluşturun. , AZURE_CLIENT_IDve AZURE_CLIENT_SECRETalınAZURE_TENANT_ID.

Gerekli bağımlılıkları ekleme

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

Gerekli özellikleri ekleme

özelliğini spring.cloud.azure.active-directory.application-type olarak web_application_and_resource_serverayarlayın ve her yetkilendirme istemcisi için yetkilendirme türünü belirtin.

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

Dekont

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

SecurityFilterChain Tanımlama

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

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

Yapılandırma

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

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

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

Uygulama türü

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

Uygulama türü spring-cloud-azure-starter-active-directory:

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

Azure Active Directory B2C ile Spring Security

Azure Active Directory (Azure AD) B2C, müşterilerin uygulamalarınızı kullanırken nasıl kaydolduğunu, oturum açtığını ve profillerini yönettiğini özelleştirip denetlemenizi sağlayan bir kimlik yönetimi sistemidir. Azure AD B2C, aynı anda müşterilerinizin kimliklerini korurken bu eylemleri mümkün kılar.

Bağımlılık kurulumu

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

Yapılandırma

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

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

Tam yapılandırmalar için Spring Cloud Azure yapılandırma özelliklerini gözden geçirin.

Temel kullanım

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

  1. Bir web uygulamasına erişme.

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

  3. Kaynak sunucusuna erişme.

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

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

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

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

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

Uygulama Adınızı (örneğinwebapp), Yanıt URL'si için ekleyinhttp://localhost:8080/login/oauth2/code/, Uygulama Kimliğini olarak WEB_APP_AZURE_CLIENT_IDkaydedin ve Kaydet'i seçin.

Uygulamanızdan Anahtarlar'ı seçin, oluşturmak WEB_APP_AZURE_CLIENT_SECRETiçin Anahtar oluştur'a ve ardından Kaydet'e tıklayın.

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

Sırasıyla kullanıcı akışları oluşturmak için Kaydolma veya giriş, Profil düzenleme ve Parola sıfırlama'yı seçin. Kullanıcı akışınızın Adını ve Kullanıcı özniteliklerini ve taleplerini belirtin, ardından Oluştur'u seçin.

API izinleri İzin ekle>Microsoft API'leri'ni> seçin, Microsoft Graph'ı seçin, Temsilci izinleri'ni seçin, offline_access ve openid izinlerini seçin ve ardından işlemi tamamlamak için İzin ekle'yi seçin.

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

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

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

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

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

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

Java kodunuzu yazın.

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

@Controller
public class WebController {

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

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

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

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

aad-b2c-web-application örneğinden home.html dosyasını kopyalayın ve ve PASSWORD_RESET_USER_FLOW değerini daha önce kullandığınız kullanıcı akışı adlarınızla değiştirinPROFILE_EDIT_USER_FLOW.

Uygulamanızı derleyin ve test edin. 8080 numaralı bağlantı noktasında çalıştıralımWebapp.

Uygulamanız Maven tarafından derlenip başlatıldıktan sonra bir web tarayıcısında açın http://localhost:8080/ . Oturum açma sayfasına yönlendirilmelisiniz.

Oturum açma kullanıcı akışını içeren bağlantıyı seçin. Kimlik doğrulama işlemini başlatmak için Azure AD B2C'ye yönlendirilmelisiniz.

Başarıyla oturum açtıktan sonra tarayıcıdan örneği home page görmeniz gerekir.

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

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

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

Uygulamanızın Adını belirtin (örneğinwebApiA), Uygulama Kimliğini olarak WEB_API_A_AZURE_CLIENT_IDkaydedin ve Kaydet'i seçin.

Uygulamanızdan Anahtarlar'ı seçin, oluşturmak WEB_API_A_AZURE_CLIENT_SECRETiçin Anahtar oluştur'a ve ardından Kaydet'e tıklayın.

Gezinti bölmesinden BIR API'yi kullanıma sunma'yı ve ardından Ayarla'yı seçin. Uygulama Kimliği URI'sini olarak WEB_API_A_APP_ID_URLkaydedin ve Kaydet'i seçin.

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

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

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

API izinleri>İzin ekle>API'lerim'i seçin, WebApiA uygulama adı'nı seçin, Uygulama İzinleri'ni seçin, WebApiA.SampleScope izni'ni seçin ve ardından işlemi tamamlamak için İzin ekle'yi seçin.

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

Azure portal screenshot showing application API permissions screen.

Bir web uygulamasına erişme senaryosu temelinde aşağıdaki bağımlılığı ekleyin.

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

Web uygulamasına erişme senaryosu temelinde aşağıdaki yapılandırmayı ekleyin.

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

Dekont

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

Webapp Java kodunuzu yazın.

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

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

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

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

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

Uygulamanızı derleyin ve test edin. Sırasıyla 8080 ve WebApiA 8081 numaralı bağlantı noktalarını çalıştırınWebapp. Webapp ve WebApiA uygulamalarını başlatın. Başarıyla oturum açtıktan sonra giriş sayfasına dönün. Daha sonra kaynak yanıtını WebApiA almak için erişebilirsinizhttp://localhost:8080/webapp/webApiA.

Kullanım 3: Kaynak sunucusuna erişme

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

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

Web uygulamanız için izin ekleyin WebApiA ve yönetici onayı verin.

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

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

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

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

Dekont

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

Java kodunuzu yazın.

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

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

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

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

Uygulamanızı derleyin ve test edin. 8081 numaralı bağlantı noktasında çalıştıralımWebApiA. Kaynak için erişim belirtecini webApiA alın ve taşıyıcı yetkilendirme üst bilgisi olarak erişin http://localhost:8081/webApiA/sample .

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

Bu senaryo, OAuth2 istemci kimlik bilgileri akışına bağlı olarak Kaynak sunucusuna erişme yükseltmesi ve diğer uygulama kaynaklarına erişimi destekler.

Önceki adımlara başvurarak bir WebApiB uygulama oluşturur ve uygulama iznini WebApiB.SampleScopekullanıma sunarız.

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

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

İzinler için WebApiB yönetici onayı verin.

Azure portal screenshot showing application WebApiA API permissions screen.

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

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

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

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

Java kodunuzu yazın.

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

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

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

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

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

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

Uygulamanızı derleyin ve test edin. Sırasıyla 8081 ve WebApiB 8082 numaralı bağlantı noktalarını çalıştırınWebApiA. WebApiA ve WebApiB uygulamalarını başlatın, kaynak için webApiA erişim belirtecini alın ve Taşıyıcı yetkilendirme üst bilgisi olarak erişim http://localhost:8081/webApiA/webApiB/sample sağlayın.

Örnekler

Daha fazla bilgi için bkz . spring-cloud-azure-starter-active-directory-b2c örnekleri.