Поддержка Spring Cloud Для Spring Security
эта статья относится к:✅ версии 4.19.0 ✅ версии 5.20.1
В этой статье описывается, как azure Spring Cloud и Spring Security можно использовать вместе.
Spring Security с идентификатором Microsoft Entra
При создании веб-приложения управление удостоверениями и доступом всегда будет основными частями.
Azure предлагает отличную платформу для демократизации процесса разработки приложений, так как она предлагает не только облачную службу удостоверений, но и глубокую интеграцию с остальной частью экосистемы Azure.
Spring Security упрощает защиту приложений Spring на основе Spring с помощью мощных абстракций и расширяемых интерфейсов. Тем не менее, так же мощный, как платформа Spring, может быть, она не адаптирована к конкретному поставщику удостоверений.
spring-cloud-azure-starter-active-directory
предоставляет наиболее оптимальный способ подключения веб-приложения к клиенту Microsoft Entra ID (Microsoft Entra ID for short) и защитить сервер ресурсов с помощью идентификатора Microsoft Entra. Он использует протокол Oauth 2.0 для защиты веб-приложений и серверов ресурсов.
Доступ к веб-приложению
В этом сценарии используется код авторизации OAuth 2.0 поток для входа пользователя с учетной записью Майкрософт.
Системная схема
Создание необходимых ресурсов в Azure
Краткое руководство по . Регистрация приложения с помощью платформы удостоверений Майкрософт.
Создайте регистрацию приложения. Получение
AZURE_TENANT_ID
,AZURE_CLIENT_ID
иAZURE_CLIENT_SECRET
.Задайте для
redirect URI
значениеAPPLICATION_BASE_URI/login/oauth2/code/
, напримерhttp://localhost:8080/login/oauth2/code/
. Требуется хвостовая/
.
Добавление необходимых зависимостей
<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>
Добавление обязательных свойств
spring:
cloud:
azure:
active-directory:
enabled: true
profile:
tenant-id: <tenant>
credential:
client-id: ${AZURE_CLIENT_ID}
client-secret: ${AZURE_CLIENT_SECRET}
Заметка
Значения, допустимые для tenant-id
: common
, organizations
, consumers
или идентификатор клиента. Дополнительные сведения об этих значениях см. в разделе Используется неправильная конечная точка (личные учетные записи и учетные записи организации) ошибки AADSTS50020. Учетная запись пользователя от поставщика удостоверений не существует вклиента. Сведения о преобразовании приложения с одним клиентом см. в статье Преобразование однотенантного приложения в мультитенантное приложение наидентификатора Microsoft Entra.
Теперь запустите приложение и получите доступ к приложению через браузер. Вы будете перенаправлены на страницу входа Майкрософт.
Дополнительные сведения об использовании
Добавление дополнительных конфигураций безопасности
@Configuration(proxyBeanMethods = false)
@EnableWebSecurity
@EnableMethodSecurity
public class AadOAuth2LoginSecurityConfig {
/**
* Add configuration logic as needed.
*/
@Bean
SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http.apply(AadWebApplicationHttpSecurityConfigurer.aadWebApplication())
.and()
.authorizeHttpRequests()
.anyRequest().authenticated();
// Do some custom configuration.
return http.build();
}
}
Авторизация доступа по ролям приложений
Создайте необходимые ресурсы в Azure:
Чтение Добавление ролей приложения в приложение и их получение вмаркера.
Создайте роль приложения со следующими параметрами:
- Отображаемое имя: администратор
- Допустимые типы элементов: пользователи и группы
- Значение: администратор
- Включить эту роль приложения: да.
Заметка
Если вы хотите использовать управление доступом на основе ролей приложения, нельзя поместить имена групп в утверждение role
. Дополнительные сведения см. в разделе Настройка необязательных утверждений групп раздела Предоставление дополнительных утверждений приложению.
Защита конкретного метода.
class Demo {
@GetMapping("Admin")
@ResponseBody
@PreAuthorize("hasAuthority('APPROLE_Admin')")
public String admin() {
return "Admin message";
}
}
Авторизация доступа по имени группы или идентификатору группы
Добавьте связанные свойства конфигурации.
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
Защита конкретного метода.
@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";
}
}
Использование Национальной Azure вместо глобальной azure
Теперь, кроме глобального облака Azure, идентификатор Microsoft Entra развертывается в следующих национальных облаках:
Azure для государственных организаций
Azure China 21Vianet
Azure Для Германии
Ниже приведен пример использования Azure China 21Vianet.
spring:
cloud:
azure:
active-directory:
enabled: true
base-uri: https://login.partner.microsoftonline.cn
graph-base-uri: https://microsoftgraph.chinacloudapi.cn
Дополнительные сведения см. в национальных облачных развертываний.
Настройка шаблона URI перенаправления
Разработчики могут настроить URI перенаправления.
Добавьте свойства redirect-uri-template
в файл application.yml.
spring:
cloud:
azure:
active-directory:
enabled: true
redirect-uri-template: ${REDIRECT-URI-TEMPLATE}
Обновите redirect-uri
на портале Azure.
После установки redirect-uri-template
необходимо обновить построитель безопасности:
@Configuration(proxyBeanMethods = false)
@EnableWebSecurity
@EnableMethodSecurity
public class AadOAuth2LoginSecurityConfig {
/**
* Add configuration logic as needed.
*/
@Bean
public SecurityFilterChain htmlFilterChain(HttpSecurity http) throws Exception {
// @formatter:off
http.apply(AadWebApplicationHttpSecurityConfigurer.aadWebApplication())
.and()
.oauth2Login()
.loginProcessingUrl("${REDIRECT-URI-TEMPLATE}")
.and()
.authorizeHttpRequests()
.anyRequest().authenticated();
// @formatter:on
return http.build();
}
}
Подключение к идентификатору Microsoft Entra через прокси-сервер
Чтобы подключить идентификатор Microsoft Entra через прокси-сервер, укажите RestTemplateCustomizer
боб, как показано в следующем примере:
@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);
};
}
}
Образцы
Пример проекта: aad-web-application.
Веб-приложение, обращающееся к серверам ресурсов
Системная схема
Создание необходимых ресурсов в Azure
Краткое руководство по . Регистрация приложения с помощью платформы удостоверений Майкрософт.
Создайте регистрацию приложения. Получение
AZURE_TENANT_ID
,AZURE_CLIENT_ID
иAZURE_CLIENT_SECRET
.Задайте для
redirect URI
значениеAPPLICATION_BASE_URI/login/oauth2/code/
, напримерhttp://localhost:8080/login/oauth2/code/
. Требуется хвостовая/
.
Добавление необходимых зависимостей
<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>
Добавление обязательных свойств
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
Заметка
Значения, допустимые для tenant-id
: common
, organizations
, consumers
или идентификатор клиента. Дополнительные сведения об этих значениях см. в разделе Используется неправильная конечная точка (личные учетные записи и учетные записи организации) ошибки AADSTS50020. Учетная запись пользователя от поставщика удостоверений не существует вклиента. Сведения о преобразовании приложения с одним клиентом см. в статье Преобразование однотенантного приложения в мультитенантное приложение наидентификатора Microsoft Entra.
Здесь graph
имя OAuth2AuthorizedClient
, scopes
означает области, необходимые для согласия при входе.
Использование OAuth2AuthorizedClient в приложении
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);
}
}
Теперь запустите приложение и получите доступ к приложению в браузере. Затем вы будете перенаправлены на страницу входа Майкрософт.
Дополнительные сведения об использовании
Поток учетных данных клиента
Поток кода авторизации по умолчанию
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
Заметка
Значения, допустимые для tenant-id
: common
, organizations
, consumers
или идентификатор клиента. Дополнительные сведения об этих значениях см. в разделе Используется неправильная конечная точка (личные учетные записи и учетные записи организации) ошибки AADSTS50020. Учетная запись пользователя от поставщика удостоверений не существует вклиента. Сведения о преобразовании приложения с одним клиентом см. в статье Преобразование однотенантного приложения в мультитенантное приложение наидентификатора Microsoft Entra.
Доступ к нескольким серверам ресурсов
В одном веб-приложении можно получить доступ к нескольким серверам ресурсов, настроив следующее:
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
Заметка
Значения, допустимые для tenant-id
: common
, organizations
, consumers
или идентификатор клиента. Дополнительные сведения об этих значениях см. в разделе Используется неправильная конечная точка (личные учетные записи и учетные записи организации) ошибки AADSTS50020. Учетная запись пользователя от поставщика удостоверений не существует вклиента. Сведения о преобразовании приложения с одним клиентом см. в статье Преобразование однотенантного приложения в мультитенантное приложение наидентификатора Microsoft Entra.
Затем вы можете использовать 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);
}
}
Образцы
Пример проекта: aad-web-application.
Доступ к серверу ресурсов
Этот сценарий не поддерживает вход, просто защищает сервер, проверяя маркер доступа. Если маркер доступа действителен, сервер обслуживает запрос.
Системная схема
Создание необходимых ресурсов в Azure
Краткое руководство по . Регистрация приложения с помощью платформы удостоверений Майкрософт.
Создайте регистрацию приложения. Получение
AZURE_CLIENT_ID
.Краткое руководство по . Настройка приложения для предоставления веб-API.
Предоставление веб-API с областью с именем
Scope-1
.
Добавление необходимых зависимостей
<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>
Добавление обязательных свойств
spring:
cloud:
azure:
active-directory:
enabled: true
credential:
client-id: ${AZURE_CLIENT_ID}
Теперь запустите приложение и получите доступ к веб-API приложения.
Вы получите 401 без маркера доступа.
Доступ к приложению с помощью маркера доступа. Будут проверены следующие утверждения в маркере доступа:
iss
. Маркер доступа должен быть выдан идентификатором Microsoft Entra.nbf
: текущее время не может быть доnbf
.exp
: текущее время не может быть послеexp
.aud
: еслиspring.cloud.azure.active-directory.credential.client-id
илиspring.cloud.azure.active-directory.credential.app-id-uri
настроено, аудитория должна быть равна настроеннойclient-id
илиapp-id-uri
. Если два свойства не настроены, это утверждение не будет проверено.
Дополнительные сведения о маркере доступа см. в документация MS о маркерах доступа платформы удостоверений Майкрософт.
Дополнительные сведения об использовании
Добавление дополнительных конфигураций безопасности
@Configuration(proxyBeanMethods = false)
@EnableWebSecurity
@EnableMethodSecurity
public class AadOAuth2ResourceServerSecurityConfig {
/**
* Add configuration logic as needed.
*/
@Bean
public SecurityFilterChain htmlFilterChain(HttpSecurity http) throws Exception {
// @formatter:off
http.apply(AadResourceServerHttpSecurityConfigurer.aadResourceServer())
.and()
.authorizeHttpRequests()
.anyRequest().authenticated();
// @formatter:on
return http.build();
}
}
Проверка разрешений по областям
Создайте необходимые ресурсы в Azure.
Краткое руководство по . Настройка приложения для предоставления веб-API.
Предоставление веб-API с областью с именем
Scope1
.
Защита конкретного метода.
class Demo { @GetMapping("scope1") @ResponseBody @PreAuthorize("hasAuthority('SCOPE_Scope1')") public String scope1() { return "Congratulations, you can access `scope1` endpoint."; } }
При этом при доступе к конечной точке /scope1
будут проверены следующие утверждения в маркере доступа:
-
scp
: значение должно содержатьScope1
.
Проверка разрешений по ролям приложений
Создайте необходимые ресурсы в Azure.
Чтение Добавление ролей приложения в приложение и их получение вмаркера.
Создайте роль приложения со следующими параметрами:
- Отображаемое имя: AppRole1
- Допустимые типы элементов: пользователи и группы
- Значение: AppRole1
- Включить эту роль приложения: да.
Защита конкретного метода.
class Demo { @GetMapping("app-role1") @ResponseBody @PreAuthorize("hasAuthority('APPROLE_AppRole1')") public String appRole1() { return "Congratulations, you can access `app-role1` endpoint."; } }
При этом при доступе к конечной точке /app-role1
будут проверены следующие утверждения в маркере доступа:
-
roles
: значение должно содержатьAppRole1
.
Использование проверки подлинности клиента JWT
Чтобы использовать веб-токен JSON (JWT) для проверки подлинности клиента, выполните следующие действия.
- См. раздел Регистрация сертификата с помощью платформы удостоверений Майкрософт раздела учетные данные сертификата проверки подлинности приложения платформы удостоверений Майкрософт.
- Отправьте сертификат PEM в приложение, зарегистрированное на портале Azure.
- Настройте путь к сертификату и пароль . PFX или . Сертификат P12.
- Добавьте свойство
spring.cloud.azure.active-directory.authorization-clients.azure.client-authentication-method=private_key_jwt
конфигурацию клиенту для проверки подлинности с помощью проверки подлинности клиента JWT.
В следующем примере файла конфигурации используется сценарий веб-приложения. Сведения о сертификате настраиваются в глобальных свойствах.
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
Заметка
Значения, допустимые для tenant-id
: common
, organizations
, consumers
или идентификатор клиента. Дополнительные сведения об этих значениях см. в разделе Используется неправильная конечная точка (личные учетные записи и учетные записи организации) ошибки AADSTS50020. Учетная запись пользователя от поставщика удостоверений не существует вклиента. Сведения о преобразовании приложения с одним клиентом см. в статье Преобразование однотенантного приложения в мультитенантное приложение наидентификатора Microsoft Entra.
Вы также можете настроить сведения о сертификате в свойствах службы active-directory
, как показано в этом примере:
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
Заметка
Значения, допустимые для tenant-id
: common
, organizations
, consumers
или идентификатор клиента. Дополнительные сведения об этих значениях см. в разделе Используется неправильная конечная точка (личные учетные записи и учетные записи организации) ошибки AADSTS50020. Учетная запись пользователя от поставщика удостоверений не существует вклиента. Сведения о преобразовании приложения с одним клиентом см. в статье Преобразование однотенантного приложения в мультитенантное приложение наидентификатора Microsoft Entra.
Подключение к идентификатору Microsoft Entra через прокси-сервер
Чтобы подключить идентификатор Microsoft Entra через прокси-сервер, предоставьте RestTemplateCustomizer
bean. Дополнительные сведения см. в разделе Подключение к идентификатору Microsoft Entra с помощью прокси-.
Образцы
Пример проекта: aad-resource-server.
Сервер ресурсов, посещая другие серверы ресурсов
Системная схема
Создание необходимых ресурсов в Azure
Краткое руководство по . Регистрация приложения с помощью платформы удостоверений Майкрософт.
Создайте регистрацию приложения. Получение
AZURE_TENANT_ID
,AZURE_CLIENT_ID
иAZURE_CLIENT_SECRET
.
Добавление необходимых зависимостей
<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>
Добавление обязательных свойств
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
Заметка
Значения, допустимые для tenant-id
: common
, organizations
, consumers
или идентификатор клиента. Дополнительные сведения об этих значениях см. в разделе Используется неправильная конечная точка (личные учетные записи и учетные записи организации) ошибки AADSTS50020. Учетная запись пользователя от поставщика удостоверений не существует вклиента. Сведения о преобразовании приложения с одним клиентом см. в статье Преобразование однотенантного приложения в мультитенантное приложение наидентификатора Microsoft Entra.
Использование OAuth2AuthorizedClient в приложении
public class SampleController {
@GetMapping("call-graph")
public String callGraph(@RegisteredOAuth2AuthorizedClient("graph") OAuth2AuthorizedClient graph) {
return callMicrosoftGraphMeEndpoint(graph);
}
}
Образцы
Пример проекта: aad-resource-server-obo.
Веб-приложение и сервер ресурсов в одном приложении
Создание необходимых ресурсов в Azure
Краткое руководство по . Регистрация приложения с помощью платформы удостоверений Майкрософт.
Создайте регистрацию приложения. Получение
AZURE_TENANT_ID
,AZURE_CLIENT_ID
иAZURE_CLIENT_SECRET
.
Добавление необходимых зависимостей
<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>
Добавление обязательных свойств
Задайте для свойства spring.cloud.azure.active-directory.application-type
значение web_application_and_resource_server
и укажите тип авторизации для каждого клиента авторизации.
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
Заметка
Значения, допустимые для tenant-id
: common
, organizations
, consumers
или идентификатор клиента. Дополнительные сведения об этих значениях см. в разделе Используется неправильная конечная точка (личные учетные записи и учетные записи организации) ошибки AADSTS50020. Учетная запись пользователя от поставщика удостоверений не существует вклиента. Сведения о преобразовании приложения с одним клиентом см. в статье Преобразование однотенантного приложения в мультитенантное приложение наидентификатора Microsoft Entra.
Определение securityFilterChain
Настройте несколько экземпляров SecurityFilterChain
.
AadWebApplicationAndResourceServerConfig
содержит две конфигурации цепочки фильтров безопасности для сервера ресурсов и веб-приложения.
@Configuration(proxyBeanMethods = false)
@EnableWebSecurity
@EnableMethodSecurity
public class AadWebApplicationAndResourceServerConfig {
@Bean
@Order(1)
public SecurityFilterChain apiFilterChain(HttpSecurity http) throws Exception {
http.apply(AadResourceServerHttpSecurityConfigurer.aadResourceServer())
.and()
// All the paths that match `/api/**`(configurable) work as the resource server. Other paths work as the web application.
.securityMatcher("/api/**")
.authorizeHttpRequests()
.anyRequest().authenticated();
return http.build();
}
@Bean
public SecurityFilterChain htmlFilterChain(HttpSecurity http) throws Exception {
// @formatter:off
http.apply(AadWebApplicationHttpSecurityConfigurer.aadWebApplication())
.and()
.authorizeHttpRequests()
.requestMatchers("/login").permitAll()
.anyRequest().authenticated();
// @formatter:on
return http.build();
}
}
Конфигурация
Настраиваемые свойства spring-cloud-azure-starter-active-directory:
Имя | Описание |
---|---|
spring.cloud.azure.active-directory.app-id-uri | URI идентификатора приложения, который может использоваться в утверждении "aud" id_token. |
spring.cloud.azure.active-directory.application-type | Тип приложения Microsoft Entra. |
spring.cloud.azure.active-directory.authenticate-additional-parameters | Добавьте дополнительные параметры в URL-адрес авторизации. |
spring.cloud.azure.active-directory.authorization-client | Клиенты авторизации OAuth2. |
spring.cloud.azure.active-directory.credential.client-id | Идентификатор клиента, используемый при выполнении проверки подлинности субъекта-службы с помощью Azure. |
spring.cloud.azure.active-directory.credential.client-secret | Секрет клиента, используемый при выполнении проверки подлинности субъекта-службы с помощью Azure. |
spring.cloud.azure.active-directory.jwk-set-cache-жизни | Срок действия кэшированного набора JWK до истечения срока действия по умолчанию составляет 5 минут. |
spring.cloud.azure.active-directory.jwk-set-cache-refresh-time | Время обновления кэшированного набора JWK до истечения срока действия по умолчанию составляет 5 минут. |
spring.cloud.azure.active-directory.jwt-connect-timeout | Время ожидания подключения для вызова удаленного URL-адреса JWKSet. |
spring.cloud.azure.active-directory.jwt-read-timeout | Время ожидания чтения для вызова удаленного URL-адреса JWKSet. |
spring.cloud.azure.active-directory.jwt-size-limit | Ограничение размера в байтах вызова удаленного URL-адреса JWKSet. |
spring.cloud.azure.active-directory.post-logout-redirect-uri | URI перенаправления после выхода. |
spring.cloud.azure.active-directory.profile.cloud-type | Имя облака Azure для подключения. Поддерживаемые типы: AZURE, AZURE_CHINA, AZURE_GERMANY, AZURE_US_GOVERNMENT, OTHER. |
spring.cloud.azure.active-directory.profile.environment | Свойства конечных точек Microsoft Entra. |
spring.cloud.azure.active-directory.profile.tenant-id | Идентификатор клиента Azure. Значения, допустимые для tenant-id : common , organizations , consumers или идентификатор клиента. |
spring.cloud.azure.active-directory.redirect-uri-template | Конечная точка перенаправления: используется сервером авторизации для возврата ответов, содержащих учетные данные авторизации клиенту с помощью агента пользователя-владельца ресурса. Значение по умолчанию — {baseUrl}/login/oauth2/code/ . |
spring.cloud.azure.active-directory.resource-server.claim-to-authority-prefix-map | Настройте утверждение, которое будет использоваться для сборки GrantedAuthority и префикса строкового значения GrantedAuthority. Значение по умолчанию: "scp" —> "SCOPE_", "роли" —> "APPROLE_". |
spring.cloud.azure.active-directory.resource-server.principal-claim-name | Настройте утверждение в маркере доступа, возвращаемое в authenticationdPrincipal#getName. Значение по умолчанию — sub. |
spring.cloud.azure.active-directory.session-less | Если значение true активирует фильтр проверки подлинности без отслеживания состояния AadAppRoleStatlessAuthenticationFilter. Значение по умолчанию равно false, которое активирует AadAuthenticationFilter. |
spring.cloud.azure.active-directory.user-group.allowed-group-ids | Идентификаторы группы можно использовать для создания GrantedAuthority. |
spring.cloud.azure.active-directory.user-group.allowed-group-name | Имена групп можно использовать для создания GrantedAuthority. |
spring.cloud.azure.active-directory.user-group.use-transitive-members | Если значение true, используйте команду "v1.0/me/transitiveMemberOf", чтобы получить элементы. В противном случае используйте "v1.0/me/memberOf". Значение по умолчанию — false . |
spring.cloud.azure.active-directory.user-name-attribute | Определите, какое утверждение должно быть именем участника. |
Ниже приведены некоторые примеры использования этих свойств:
Тип приложения
Тип приложения можно вывести из зависимостей: spring-security-oauth2-client
или spring-security-oauth2-resource-server
. Если вычисленное значение не является нужным значением, можно указать тип приложения. Ниже приведена таблица допустимых значений и выводимых значений:
Тип приложения spring-cloud-azure-starter-active-directory
:
Имеет зависимость: spring-security-oauth2-client |
Имеет зависимость: spring-security-oauth2-resource-server |
Допустимые значения типа приложения | Выводимое значение |
---|---|---|---|
Да | Нет | web_application |
web_application |
Нет | Да | resource_server |
resource_server |
Да | Да |
web_application , resource_server , resource_server_with_obo , web_application_and_resource_server |
resource_server_with_obo |
Spring Security с azure Active Directory B2C
Azure Active Directory (Azure AD) B2C — это служба управления удостоверениями, которая позволяет настраивать и контролировать регистрацию, вход клиентов и управление их профилями при использовании приложений. Azure AD B2C позволяет выполнять эти действия при защите удостоверений клиентов одновременно.
Настройка зависимостей
<dependencies>
<dependency>
<groupId>com.azure.spring</groupId>
<artifactId>spring-cloud-azure-starter-active-directory-b2c</artifactId>
</dependency>
</dependencies>
Конфигурация
Настраиваемые свойства spring-cloud-azure-starter-active-directory-b2c:
Имя | Описание |
---|---|
spring.cloud.azure.active-directory.b2c.app-id-uri | URI идентификатора приложения, который может использоваться в утверждении aud маркера. |
spring.cloud.azure.active-directory.b2c.authenticate-additional-parameters | Дополнительные параметры проверки подлинности. |
spring.cloud.azure.active-directory.b2c.authorization-client | Укажите конфигурацию клиента. |
spring.cloud.azure.active-directory.b2c.base-uri | Базовый uri конечной точки Azure AD B2C. |
spring.cloud.azure.active-directory.b2c.credential | Сведения о учетных данных Azure AD B2C. |
spring.cloud.azure.active-directory.b2c.jwt-connect-timeout | Время ожидания подключения для вызова удаленного URL-адреса JWKSet. |
spring.cloud.azure.active-directory.b2c.jwt-read-timeout | Время ожидания чтения для вызова удаленного URL-адреса JWKSet. |
spring.cloud.azure.active-directory.b2c.jwt-size-limit | Ограничение размера в байтах вызова удаленного URL-адреса JWKSet. |
spring.cloud.azure.active-directory.b2c.login-flow | Укажите первичный ключ потока входа. Значение по умолчанию — sign-up-or-sign-in . |
spring.cloud.azure.active-directory.b2c.logout-success-url | URL-адрес перенаправления после выхода. Значение по умолчанию — http://localhost:8080/login . |
spring.cloud.azure.active-directory.b2c.profile | Сведения о профиле Azure AD B2C. |
spring.cloud.azure.active-directory.b2c.reply-url | URL-адрес ответа после получения кода авторизации. Значение по умолчанию — {baseUrl}/login/oauth2/code/ . |
spring.cloud.azure.active-directory.b2c.user-flows | Потоки пользователей. |
spring.cloud.azure.active-directory.b2c.user-name-attribute-name-name | Имя атрибута имени пользователя. |
Полные конфигурации см. в свойства конфигурации Spring Cloud Azure.
Базовое использование
Веб-приложение — это любое веб-приложение, позволяющее пользователю входить с помощью идентификатора Microsoft Entra ID, в то время как сервер ресурсов будет принимать или запрещать доступ после проверки access_token, полученной из идентификатора Microsoft Entra. В этом руководстве мы рассмотрим 4 сценария:
Доступ к веб-приложению.
Веб-приложение, обращающееся к серверам ресурсов.
Доступ к серверу ресурсов.
Сервер ресурсов, обращаюющийся к другим серверам ресурсов.
Использование 1. Доступ к веб-приложению
В этом сценарии используется код авторизации OAuth 2.0 поток для входа пользователя с помощью пользователя Azure AD B2C.
Выберите Azure AD B2C в меню портала, выберите Приложения, а затем выберите Добавить.
Укажите
Выберите ключи из приложения, выберите Создать ключ, чтобы создать WEB_APP_AZURE_CLIENT_SECRET
, а затем нажмите кнопку Сохранить.
Выберите Потоки пользователей слева, а затем выберите Новый поток пользователя.
Выберите зарегистрироваться или в, редактирование профиляи сброс пароля, чтобы создать потоки пользователей соответственно. Укажите имени пользователя и атрибуты пользователя и утверждения, а затем выберите Создать.
Выберите разрешения API>Добавить разрешения>API Microsoft, выберите Microsoft Graph, выберите Делегированные разрешения, выберите offline_access и разрешения openid, а затем выберите добавить разрешения для завершения процесса.
Предоставьте согласие администратора для разрешений Graph.
Добавьте следующие зависимости в файл pom.xml.
<dependencies>
<dependency>
<groupId>com.azure.spring</groupId>
<artifactId>azure-spring-boot-starter-active-directory-b2c</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.thymeleaf.extras</groupId>
<artifactId>thymeleaf-extras-springsecurity6</artifactId>
</dependency>
</dependencies>
Добавьте свойства в файл application.yml с помощью значений, созданных ранее, как показано в следующем примере:
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.
Для кода контроллера можно ознакомиться со следующим примером:
@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";
}
}
В коде конфигурации безопасности можно ознакомиться со следующим примером:
@Configuration(proxyBeanMethods = false)
@EnableWebSecurity
public class WebSecurityConfiguration {
private final AadB2cOidcLoginConfigurer configurer;
public WebSecurityConfiguration(AadB2cOidcLoginConfigurer configurer) {
this.configurer = configurer;
}
@Bean
SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
// @formatter:off
http.authorizeHttpRequests()
.anyRequest().authenticated()
.and()
.apply(configurer);
// @formatter:on
return http.build();
}
}
Скопируйте home.html из примера aad-b2c-web-application
и замените PROFILE_EDIT_USER_FLOW
и PASSWORD_RESET_USER_FLOW
именами потоков пользователя, которые вы использовали ранее.
Создание и тестирование приложения. Позвольте Webapp
выполняться через порт 8080
.
После создания и запуска приложения Maven откройте http://localhost:8080/
в веб-браузере. Вы должны быть перенаправлены на страницу входа.
Выберите ссылку с потоком пользователя для входа. Чтобы запустить процесс проверки подлинности, необходимо перенаправить Azure AD B2C.
После успешного входа в систему вы увидите пример home page
из браузера.
Использование 2. Доступ к серверам ресурсов веб-приложения
Этот сценарий основан на доступе к веб-приложению сценария, чтобы приложение могли получать доступ к другим ресурсам. Этот сценарий поток предоставления учетных данных клиента OAuth 2.0.
Выберите Azure AD B2C в меню портала, выберите Приложения, а затем выберите Добавить.
Укажите
Выберите ключи из приложения, выберите Создать ключ, чтобы создать WEB_API_A_AZURE_CLIENT_SECRET
, а затем нажмите кнопку Сохранить.
Выберите Предоставить API в области навигации, а затем выберите Задать. Запишите URI идентификатора приложения в качестве WEB_API_A_APP_ID_URL
, а затем выберите Сохранить.
Выберите манифест в области навигации и вставьте следующий сегмент JSON в массив appRoles
. Запишите URI идентификатора приложения в качестве WEB_API_A_APP_ID_URL
, запишите значение роли приложения в качестве WEB_API_A_ROLE_VALUE
, а затем выберите Сохранить.
{
"allowedMemberTypes": [
"Application"
],
"description": "WebApiA.SampleScope",
"displayName": "WebApiA.SampleScope",
"id": "04989db0-3efe-4db6-b716-ae378517d2b7",
"isEnabled": true,
"value": "WebApiA.SampleScope"
}
Выберите разрешения API>Добавить разрешение>мои API, выберите имя приложения WebApiA, выберите разрешения приложений, выберите разрешения WebApiA.SampleScope, а затем выберите Добавить разрешения, чтобы завершить процесс.
Предоставьте согласие администратора для разрешений WebApiA.
Добавьте следующую зависимость на основе сценария Доступа к веб-приложению.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
Добавьте следующую конфигурацию на основе сценария Доступа к веб-приложению.
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
Заметка
Значения, допустимые для tenant-id
: common
, organizations
, consumers
или идентификатор клиента. Дополнительные сведения об этих значениях см. в разделе Используется неправильная конечная точка (личные учетные записи и учетные записи организации) ошибки AADSTS50020. Учетная запись пользователя от поставщика удостоверений не существует вклиента. Сведения о преобразовании приложения с одним клиентом см. в статье Преобразование однотенантного приложения в мультитенантное приложение наидентификатора Microsoft Entra.
Напишите код Webapp
Java.
Для кода контроллера можно ознакомиться со следующим примером:
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.");
}
}
Код конфигурации безопасности совпадает с доступом к веб-приложению сценария. Добавьте еще одну webClient
бобов следующим образом:
public class SampleConfiguration {
@Bean
public WebClient webClient(OAuth2AuthorizedClientManager oAuth2AuthorizedClientManager) {
ServletOAuth2AuthorizedClientExchangeFilterFunction function =
new ServletOAuth2AuthorizedClientExchangeFilterFunction(oAuth2AuthorizedClientManager);
return WebClient.builder()
.apply(function.oauth2Configuration())
.build();
}
}
Чтобы написать код java WebApiA
, см. раздел Доступ к серверу ресурсов.
Создание и тестирование приложения. Позвольте Webapp
и WebApiA
работать на 8080
портов и 8081
соответственно. Запустите приложения Webapp
и WebApiA
. Вернитесь на домашнюю страницу после успешного входа. Затем вы можете получить http://localhost:8080/webapp/webApiA
, чтобы получить ответ WebApiA
ресурса.
Использование 3. Доступ к серверу ресурсов
Этот сценарий не поддерживает вход. Просто защитите сервер, проверяя маркер доступа, и, если он действителен, он обслуживает запрос.
Сведения о создании разрешения WebApiA
см. в разделе Использование 2:веб-приложения, обращающиеся к ресурсам.
Добавьте WebApiA
разрешение и предоставьте согласие администратора для веб-приложения.
Добавьте следующие зависимости в файл pom.xml.
<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>
Добавьте следующую конфигурацию.
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}
Заметка
Значения, допустимые для tenant-id
: common
, organizations
, consumers
или идентификатор клиента. Дополнительные сведения об этих значениях см. в разделе Используется неправильная конечная точка (личные учетные записи и учетные записи организации) ошибки AADSTS50020. Учетная запись пользователя от поставщика удостоверений не существует вклиента. Сведения о преобразовании приложения с одним клиентом см. в статье Преобразование однотенантного приложения в мультитенантное приложение наидентификатора Microsoft Entra.
Напишите код Java.
Для кода контроллера можно ознакомиться со следующим примером:
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.";
}
}
В коде конфигурации безопасности можно ознакомиться со следующим примером:
@Configuration(proxyBeanMethods = false)
@EnableWebSecurity
@EnableMethodSecurity
public class ResourceServerConfiguration {
@Bean
public SecurityFilterChain htmlFilterChain(HttpSecurity http) throws Exception {
JwtAuthenticationConverter authenticationConverter = new JwtAuthenticationConverter();
JwtGrantedAuthoritiesConverter jwtGrantedAuthoritiesConverter = new JwtGrantedAuthoritiesConverter();
jwtGrantedAuthoritiesConverter.setAuthorityPrefix("APPROLE_");
authenticationConverter.setJwtGrantedAuthoritiesConverter(jwtGrantedAuthoritiesConverter);
// @formatter:off
http.authorizeHttpRequests((requests) -> requests.anyRequest().authenticated())
.oauth2ResourceServer()
.jwt()
.jwtAuthenticationConverter(authenticationConverter);
// @formatter:on
return http.build();
}
}
Создание и тестирование приложения. Позвольте WebApiA
выполняться через порт 8081
. Получите маркер доступа для ресурса webApiA
, а затем получите доступ к http://localhost:8081/webApiA/sample
в качестве заголовка авторизации носителя.
Использование 4. Доступ к другим серверам ресурсов
Этот сценарий представляет собой обновление доступа к серверу ресурсови поддерживает доступ к другим ресурсам приложения на основе потока учетных данных клиента OAuth2.
Ссылаясь на предыдущие шаги, мы создадим приложение WebApiB
и предоставляем разрешение приложения WebApiB.SampleScope
.
{
"allowedMemberTypes": [
"Application"
],
"description": "WebApiB.SampleScope",
"displayName": "WebApiB.SampleScope",
"id": "04989db0-3efe-4db6-b716-ae378517d2b7",
"isEnabled": true,
"lang": null,
"origin": "Application",
"value": "WebApiB.SampleScope"
}
Предоставьте согласие администратора для WebApiB
разрешений.
На основе доступа к серверу ресурсовдобавьте следующую зависимость в файл pom.xml.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
Добавьте следующую конфигурацию на основе доступа к конфигурации сервера ресурсов сценария.
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.
Для кода контроллера WebApiA
см. следующий пример:
public class SampleController {
/**
* Access to protected data from WebApiA to WebApiB through client credential flow. The access token is obtained by webclient, or
* <p>@RegisteredOAuth2AuthorizedClient("webApiA")</p>. In the end, these two approaches will be executed to
* DefaultOAuth2AuthorizedClientManager#authorize method, get the access token.
*
* @return Respond to protected data from WebApi B.
*/
@GetMapping("/webApiA/webApiB/sample")
@PreAuthorize("hasAuthority('APPROLE_WebApiA.SampleScope')")
public String callWebApiB() {
String body = webClient
.get()
.uri(LOCAL_WEB_API_B_SAMPLE_ENDPOINT)
.attributes(clientRegistrationId("webApiB"))
.retrieve()
.bodyToMono(String.class)
.block();
LOGGER.info("Call callWebApiB(), request '/webApiB/sample' returned: {}", body);
return "Request 'webApiA/webApiB/sample'(WebApi A) returned a " + (body != null ? "success." : "failure.");
}
}
Для кода контроллера WebApiB
см. следующий пример:
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.";
}
}
Код конфигурации безопасности совпадает с доступом к сценарию сервера ресурсов, добавляется другая webClient
, как показано ниже.
public class SampleConfiguration {
@Bean
public WebClient webClient(OAuth2AuthorizedClientManager oAuth2AuthorizedClientManager) {
ServletOAuth2AuthorizedClientExchangeFilterFunction function =
new ServletOAuth2AuthorizedClientExchangeFilterFunction(oAuth2AuthorizedClientManager);
return WebClient.builder()
.apply(function.oauth2Configuration())
.build();
}
}
Создание и тестирование приложения. Позвольте WebApiA
и WebApiB
работать на 8081
портов и 8082
соответственно. Запустите приложения WebApiA
и WebApiB
, получите маркер доступа для ресурса webApiA
и доступ http://localhost:8081/webApiA/webApiB/sample
в качестве заголовка авторизации носителя.
Образцы
Дополнительные сведения см. в примерах spring-cloud-azure-starter-active-directory-b2c.